package bwie.day02view; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; /** * Created by Zhengaihua on 2016/11/1. */ public class CustomCircular extends View { private Paint paint;//画笔 private int mColor; private float radius; private TypedArray typedArray; private String mText; private float mRadius; private float mTextSize; private Rect rect; private int widthMode; private int widthSize; public CustomCircular(Context context) { this(context, null); } public CustomCircular(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomCircular(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomCircular, defStyleAttr, 0); radius = 40; mText = typedArray.getString(R.styleable.CustomCircular_ztext);//获得文本 mColor = typedArray.getInt(R.styleable.CustomCircular_zcolor, Color.GREEN);//获得颜色 /** * 单位的互换, 其中,第一个参数是你想要得到的单位,第二个参数是你想得到的单位的数值, 比如:我要得到一个20sp, 那么我就用TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 25,getResources().getDisplayMetrics()), 返回的就是25sp对应的px数值了。 */ int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); mRadius = typedArray.getDimension(R.styleable.CustomCircular_radius, px);//获取半径 int px1 = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); mTextSize = typedArray.getDimension(R.styleable.CustomCircular_ztextSzie, px1); typedArray.recycle();//释放资源 paint = new Paint(); rect = new Rect(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); widthMode = MeasureSpec.getMode(widthMeasureSpec); widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width = 0; int height = 0; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { width = (int) (4 * radius); } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { height = (int) (4 * radius); } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getWidth(); int height = getHeight(); //画一个大圆 paint.setColor(Color.YELLOW); canvas.drawCircle(width / 2, height / 2, radius * 2, paint); //画一个小圆 paint.setColor(Color.WHITE); canvas.drawCircle(width / 2, height / 2, radius, paint); // String str = "gao"; paint.setTextSize(mTextSize); paint.getTextBounds(str, 0, str.length(), rect); /** * 处理字体大小 */ if (rect.width() > radius) { paint.setTextSize(20); paint.getTextBounds(str, 0, str.length(), rect); } paint.setColor(Color.BLACK); canvas.drawText(str, width / 2 - rect.width() / 2, height / 2 + rect.height() / 2, paint); } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="bwie.day02view.MainActivity"> <bwie.day02view.CustomCircular android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:ztext="nihao" app:ztextSzie="20dp" /> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="ztext" format="string" /> <attr name="ztextSzie" format="dimension" /> <attr name="radius" format="dimension" /> <attr name="zcolor" format="color" /> <declare-styleable name="CustomCircular"> <attr name="ztext" /> <attr name="ztextSzie" /> <attr name="radius" /> <attr name="zcolor" /> </declare-styleable> </resources>
相关推荐
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的用户界面。这个“android 自定义view比较综合的例子”显然涵盖了多个高级话题,旨在帮助有一定基础的开发者提升自定义...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。标题“开发自定义View 源码”所指的,是针对如何设计和实现自定义Android View类的...
在Android应用开发中,自定义View视图是一个重要的技术,它允许开发者根据特定需求创建独一无二的用户界面元素。本文将深入探讨如何通过继承View类来实现一个自定义的罗盘界面,以帮助开发者理解自定义视图的工作...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的UI组件。本项目"Android 自定义View实现水平温度计"就是这样一个实例,它通过自定义View来展示一个水平方向的温度计,...
在Android开发中,自定义View是提升应用用户体验和界面独特性的重要手段。本文将深入探讨如何实现自定义View的拖动和点击效果,主要通过两种方法进行讲解:一是使用`setOnTouchListener`并重写`onTouch`方法,二是...
Android 自定义 View 实现转盘旋转的效果 Android 的自定义 View 为开发者定义和使用个性化的 View 提供了很好的支持,想要使用自己定义的 View,需要继承 View 类,并重写构造函数和 onDraw() 函数。onDraw 函数...
本项目旨在教你如何在Android项目中创建一个自定义View,用于实现高斯模糊和毛玻璃效果,并且允许开发者自定义模糊程度。以下是关于这个主题的详细讲解。 一、高斯模糊原理 高斯模糊是一种图像处理技术,通过对图像...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。"Android 自定义View界面大合集"的主题涵盖了这个领域的广泛知识点,包括但不限于...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有表现力的UI元素,提升用户体验。本文将深度剖析如何实现一个名为“水晶/水滴 波浪球”的自定义View,并通过详细步骤讲解,帮助你掌握...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有表现力的界面元素。本示例中,我们关注的是一个自定义View,它能实现背景颜色的渐变效果,而不是常见的进度条渐变。这个自定义View是一...
方便调用,有示例。 Android自定义View图片裁剪,支持自由裁剪、按自定义比例裁剪、圆形裁剪、旋转、镜面翻转,从0到1自定义View。kotlin编写的一个自定义View。
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特的用户界面元素。本主题将深入探讨如何在Android中实现自定义组合控件,即利用多个基础控件构建一个具有特殊功能或样式的复合视图。...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加个性化和高效的设计。本项目中的"自定义View源代码"主要聚焦于一个名为"TopBar"的文件,这通常是应用顶部...
在Android开发中,创建一个能够随声音大小变化的自定义View是一种常见的需求,尤其是在音乐播放器或者音频相关的应用中。这个自定义View可以是长方形或圆柱形,旨在模仿音频波形或音量指示器的效果。下面我们将深入...
在Android开发中,自定义View和自定义属性是提升应用个性化和功能扩展性的重要手段。本文将深入探讨这两个核心概念,以及如何在实际项目中应用它们。 ### 自定义View 自定义View允许开发者创建自己的视图组件,以...
本文将深入探讨如何创建一个Android音频剪辑裁剪的自定义View,以便用户可以通过拖动来调整音频的剪切时长,并通过滑块实时显示对应的时间点。 首先,我们需要理解Android的音频处理基础。Android提供了`...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有创新性的用户界面。自定义View是Android系统框架的一部分,通过扩展系统提供的基本View类或ViewGroup类,我们可以实现自己的绘制逻辑,...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。自定义View通常涉及到绘制、事件处理、动画以及性能优化等多个方面。下面我们将...
自定义View是Android开发中常见的需求,它允许开发者扩展Android系统的内置视图,以满足特定的界面设计或交互需求。创建自定义View通常包括以下步骤: - 创建一个新的Java类,继承自`View`或`ViewGroup`。 - 重写...
在Android开发中,自定义View和自定义Button是提升应用界面独特性和交互体验的重要手段。本Demo主要展示了如何通过自定义View和自定义Button来实现特定的视觉效果和交互功能,比如Button在被点击时变换背景。下面...