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相关推荐

  1. Android自定义view详解,使用实例,自定义属性,贝塞尔曲线

    //只会触发执行onDraw方法,只会改变绘制里面的内容,条目的绘制 invalidate(); //只会触发执行onDraw方法,但是可以在子线程中刷新 postInvalidate(); //vi ...

  2. Android仿支付宝UI功能开发,Android 自定义view仿支付宝咻一咻功能

    支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能. 效果如下所示: 思路: 就是几个圆的半径不断在变大,这个可以使用动画缩放实现,还有透明动画 还有就是这是好几 ...

  3. Android自定义View(二)

    文章目录 1.构造函数 2.onMeasure() 2.1.MeasureSpec 3.onSizeChanged() 4.onLayout() 5.onDraw() 上一篇: Android自定义V ...

  4. android绘制直角坐标系,Android自定义View之扇形统计图

    Android自定义View之扇形统计图 点击标题下「蓝色微信名」可快速关注 作者| Android_gen 地址 | http://www.jianshu.com/p/cc93c5dd43ad 源码 ...

  5. Android自定义View —— TypedArray

    在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...

  6. Android 自定义View —— Canvas

    上一篇在android 自定义view Paint 里面 说了几种常见的Point 属性 绘制图形的时候下面总有一个canvas ,Canvas 是是画布 上面可以绘制点,线,正方形,圆,等等,需要和 ...

  7. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  8. Android自定义View:ViewGroup(三)

    自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...

  9. android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定

    概述: 360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话 ...

  10. android代码实现手机加速功能,Android自定义View实现内存清理加速球效果

    Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...

最新文章

  1. 工艺仿真软件_【技术简讯】电解抛光仿真软件Elsyca EPOS技术简介
  2. 简单而常用的shell 命令
  3. 关于百度地图js api的getCurrentPosition定位不准确的解决方法
  4. while循环 字符串格式化 运算符 编码初识
  5. C/C++经典程序训练1---最大公约数与最小公倍数 SDUT ACM
  6. 蓝桥杯 2012 决赛 拼音字母
  7. 什么是边界扫描(boundary scan)?
  8. 第二次作业 时事点评
  9. 如何获取主机名和当前登录用户名
  10. 【vconsole】vconsole网页调试
  11. Pycharm添加默认头注释方法
  12. linux chroot命令使用
  13. python中的and_PYTHON中的“and”是什么意思
  14. 基于simulink的超级电容,电池及DC motor充放电系统仿真
  15. 怎么在Windows电脑更新 DirectX ?
  16. 事件分发机制Android,宅家36天咸鱼翻身入职腾讯,复习指南
  17. 求全排序的经典算法“后补法”
  18. 静脉给药时css,2017年药学专业知识一复习讲义:单室模型静脉滴注给药
  19. 【教育】世界上最伟大的25个教育法则
  20. vcruntime140_1.dll丢失的解决办法

热门文章

  1. HM16.7量化部分学习记录
  2. 构造者模式与Lombok的邂逅
  3. C. Minimum Ties (构造)
  4. APM的解锁(ARM)流程
  5. [操作系统]进程管理 进程同步、死锁相关、处理机调度
  6. 在themeforest购买主题获得激活码方法
  7. signature=d392c0d1876b3909bd8f7e1f3c0bef22,【技术分享】NSA武器库:CVE-2017-9073 EsteemAudit分析...
  8. Android:执行exec app_process启动jar失败原因
  9. 系统流程图、数据流程图、IPO图 和甘特图
  10. EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning(论文阅读)