Android自定义View之CircleView
Android自定义View之CircleView
版权声明:本文为博主原创文章,未经博主允许不得转载。
转载请表明出处:http://www.cnblogs.com/cavalier-/p/5999037.html
前言
大家好,我是Cavalier,这次和大家分享一下《Android自定义View之CircleView》,不废话,下面上效果图。
分析
需求
1:随机换颜色的一个view
2:可以设置文字
动手
Setup1:继承自View,重写三个构造函数
public class CircleView extends View {public CircleView(Context context) {this(context,null);}public CircleView(Context context, AttributeSet attrs) {this(context, attrs,0);}public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}
}
上面代码中重写了三个构造函数,其中第一个是用于直接new对象,第二个是从xml创建时没有指定style时调用,第三个是指定了style时调用,通过this可以直接指向第三个构造参数,所有初始化可以直接写在第三个构造参数中
Setup2:声明所需的变量
private Paint mTextPain; //初始化画笔
private String mText = ""; //初始化文字
private int radius; //当前View的半径...public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);configPaint();
}private void configPaint() {mTextPain = new Paint();mTextPain.setColor(Color.WHITE); //设置画笔颜色为白色mTextPain.setAntiAlias(true); //开启抗锯齿,平滑文字和圆弧的边缘mTextPain.setTextAlign(Paint.Align.CENTER); //设置文本位于相对于原点的中间
}
上面代码在第三个构造函数调用了configPaint函数
Setup3:重新onDraw函数
@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);int width = getWidth() / 2; //获取宽度一半int height = getHeight() / 2; //获取高度一半radius = Math.min(width, height); //设置半径为宽或者高的最小值//paint bgmTextPain.setColor(Color.parseColor(getRandomColor())); //设置画笔颜色为随机颜色canvas.drawCircle(width, height, radius, mTextPain); //利用canvas画一个圆//paint fontmTextPain.setColor(Color.WHITE); //设置画笔白颜色mTextPain.setTextSize(dp2px(16)); //设置字体大小为16dpPaint.FontMetrics fontMetrics = mTextPain.getFontMetrics(); //获取字体测量对象canvas.drawText(mText, 0, mText.length(), radius //利用canvas画上字, radius + Math.abs(fontMetrics.top + fontMetrics.bottom) / 2, mTextPain);
}
上面代码中先获取到当前view的宽和高,取其中最小值作为背景的半径,设置了随机颜色做背景,且利用FontMetrics获取了文字的绘制位置
Setup4:添加两个辅助函数,dp2px和getRandomColor
/*** 给View设置文字* @param str*/
public void setText(String str) {if(!TextUtils.isEmpty(str)){if(str.length()>1){mText = str.substring(0,1);}else {mText = str;}}else {mText = "";}invalidate();
}
当然,我们需要将设置文字暴露给使用者,这里利用了invalidate让CircleView重新绘制一遍,目的是更改内中的文字
Setup5:添加两个辅助函数,dp2px和getRandomColor
/*** dp转px** @param dp* @return*/
private int dp2px(int dp) {// px = dp * (dpi / 160)DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();int dpi = metrics.densityDpi;return (int) (dp * (dpi / 160f) + 0.5f);
}/*** 获取随机颜色** @return*/
private String getRandomColor() {List<String> colorList = new ArrayList<String>();colorList.add("#303F9F");colorList.add("#FF4081");colorList.add("#59dbe0");colorList.add("#f57f68");colorList.add("#f8b552");colorList.add("#990099");colorList.add("#90a4ae");colorList.add("#7baaf7");colorList.add("#4dd0e1");colorList.add("#4db6ac");colorList.add("#aed581");colorList.add("#fdd835");colorList.add("#f2a600");colorList.add("#ff8a65");colorList.add("#f48fb1");colorList.add("#7986cb");colorList.add("#DEB887");colorList.add("#FF69B4");return colorList.get((int) (Math.random() * colorList.size()));
}
补充了这两个辅助函数后,代码已经完成了
How to use?
在XML中使用
...<com.ram.testdemo.view.CircleViewandroid:id="@+id/cv"android:layout_width="50dp"android:layout_height="50dp"/>...
这里注意调用时是使用你自己的Class文件全路径。
在java中使用
CircleView mCircleView = (CircleView) findViewById(R.id.cv);
mCircleView.setText("哈哈");
Souce Code
public class CircleView extends View {private Paint mTextPain; //初始化画笔private String mText = ""; //初始化文字private int radius; //当前View的半径public CircleView(Context context) {this(context, null);}public CircleView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);configPaint();}private void configPaint() {mTextPain = new Paint();mTextPain.setColor(Color.WHITE); //设置画笔颜色为白色mTextPain.setAntiAlias(true); //开启抗锯齿,平滑文字和圆弧的边缘mTextPain.setTextAlign(Paint.Align.CENTER); //设置文本位于相对于原点的中间}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);int width = getWidth() / 2; //获取宽度一半int height = getHeight() / 2; //获取高度一半radius = Math.min(width, height); //设置半径为宽或者高的最小值//paint bgmTextPain.setColor(Color.parseColor(getRandomColor())); //设置画笔颜色为随机颜色canvas.drawCircle(width, height, radius, mTextPain); //利用canvas画一个圆//paint fontmTextPain.setColor(Color.WHITE); //设置画笔白颜色mTextPain.setTextSize(dp2px(16)); //设置字体大小为16dpPaint.FontMetrics fontMetrics = mTextPain.getFontMetrics(); //获取字体测量对象canvas.drawText(mText, 0, mText.length(), radius //利用canvas画上字, radius + Math.abs(fontMetrics.top + fontMetrics.bottom) / 2, mTextPain);}/*** 给View设置文字* @param str*/public void setText(String str) {if(!TextUtils.isEmpty(str)){if(str.length()>1){mText = str.substring(0,1);}else {mText = str;}}else {mText = "";}invalidate();}/*** dp转px** @param dp* @return*/public int dp2px(int dp) {// px = dp * (dpi / 160)DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();int dpi = metrics.densityDpi;return (int) (dp * (dpi / 160f) + 0.5f);}/*** 获取随机颜色** @return*/private String getRandomColor() {List<String> colorList = new ArrayList<String>();colorList.add("#303F9F");colorList.add("#FF4081");colorList.add("#59dbe0");colorList.add("#f57f68");colorList.add("#f8b552");colorList.add("#990099");colorList.add("#90a4ae");colorList.add("#7baaf7");colorList.add("#4dd0e1");colorList.add("#4db6ac");colorList.add("#aed581");colorList.add("#fdd835");colorList.add("#f2a600");colorList.add("#ff8a65");colorList.add("#f48fb1");colorList.add("#7986cb");colorList.add("#DEB887");colorList.add("#FF69B4");return colorList.get((int) (Math.random() * colorList.size()));}
}
结尾
本篇中,我们掌握了自定义View的invalidate重绘,和FontMetrics的文本位置测量,还了解onDraw中的canvas的用法。如文中有描述不巧当的地方请指出,谢谢。
参考 : Android custom-components
转载于:https://www.cnblogs.com/cavalier-/p/5999037.html
Android自定义View之CircleView相关推荐
- Android自定义view详解,使用实例,自定义属性,贝塞尔曲线
//只会触发执行onDraw方法,只会改变绘制里面的内容,条目的绘制 invalidate(); //只会触发执行onDraw方法,但是可以在子线程中刷新 postInvalidate(); //vi ...
- Android仿支付宝UI功能开发,Android 自定义view仿支付宝咻一咻功能
支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能. 效果如下所示: 思路: 就是几个圆的半径不断在变大,这个可以使用动画缩放实现,还有透明动画 还有就是这是好几 ...
- Android自定义View(二)
文章目录 1.构造函数 2.onMeasure() 2.1.MeasureSpec 3.onSizeChanged() 4.onLayout() 5.onDraw() 上一篇: Android自定义V ...
- android绘制直角坐标系,Android自定义View之扇形统计图
Android自定义View之扇形统计图 点击标题下「蓝色微信名」可快速关注 作者| Android_gen 地址 | http://www.jianshu.com/p/cc93c5dd43ad 源码 ...
- Android自定义View —— TypedArray
在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...
- Android 自定义View —— Canvas
上一篇在android 自定义view Paint 里面 说了几种常见的Point 属性 绘制图形的时候下面总有一个canvas ,Canvas 是是画布 上面可以绘制点,线,正方形,圆,等等,需要和 ...
- android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
转载:http://blog.csdn.net/xiabing082/article/details/48781489 1. 大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...
- Android自定义View:ViewGroup(三)
自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...
- android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定
概述: 360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话 ...
- android代码实现手机加速功能,Android自定义View实现内存清理加速球效果
Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...
最新文章
- 工艺仿真软件_【技术简讯】电解抛光仿真软件Elsyca EPOS技术简介
- 简单而常用的shell 命令
- 关于百度地图js api的getCurrentPosition定位不准确的解决方法
- while循环 字符串格式化 运算符 编码初识
- C/C++经典程序训练1---最大公约数与最小公倍数 SDUT ACM
- 蓝桥杯 2012 决赛 拼音字母
- 什么是边界扫描(boundary scan)?
- 第二次作业 时事点评
- 如何获取主机名和当前登录用户名
- 【vconsole】vconsole网页调试
- Pycharm添加默认头注释方法
- linux chroot命令使用
- python中的and_PYTHON中的“and”是什么意思
- 基于simulink的超级电容,电池及DC motor充放电系统仿真
- 怎么在Windows电脑更新 DirectX ?
- 事件分发机制Android,宅家36天咸鱼翻身入职腾讯,复习指南
- 求全排序的经典算法“后补法”
- 静脉给药时css,2017年药学专业知识一复习讲义:单室模型静脉滴注给药
- 【教育】世界上最伟大的25个教育法则
- vcruntime140_1.dll丢失的解决办法
热门文章
- HM16.7量化部分学习记录
- 构造者模式与Lombok的邂逅
- C. Minimum Ties (构造)
- APM的解锁(ARM)流程
- [操作系统]进程管理 进程同步、死锁相关、处理机调度
- 在themeforest购买主题获得激活码方法
- signature=d392c0d1876b3909bd8f7e1f3c0bef22,【技术分享】NSA武器库:CVE-2017-9073 EsteemAudit分析...
- Android:执行exec app_process启动jar失败原因
- 系统流程图、数据流程图、IPO图 和甘特图
- EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning(论文阅读)