最近一直都在看自定义View这一块。差不多一个星期了吧。这个星期坚持每天更新博客,感觉自己的技术也有点突破,对自定义View的计算也有了更深的认识。

今天坐地铁玩手机的时候,看到手机一个成长天数进度的控件,觉得挺有意思的,于是想自己也写一个。效果如下:

由图可以知道,这里面有很多个元素,首先是背景的矩形区域,其次就是两个环形,然后三个Text文本。其实不复杂,我们一点一点的去实现。

首先呢,画矩形背景。这里用到一个RectF的类,这个类包含一个矩形的四个单精度浮点坐标。矩形通过上下左右4个边的坐标来表示一个矩形。这些坐标值属性可以被直接访问,用width()和 height()方法可以获取矩形的宽和高,同时他还有构造方法:

RectF一共有四个构造方法:

RectF()构造一个无参的矩形

RectF(float left,float top,float right,float bottom)构造一个指定了4个参数的矩形

RectF(Rect F r)根据指定的RectF对象来构造一个RectF对象(对象的左边坐标不变)

RectF(Rect r)根据给定的Rect对象来构造一个RectF对象

那么,这里使用第二个构造方法,代码如下:

    @Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mWidth=getWidth();mHeight=getHeight();mRectF=new RectF((float)(mWidth*0.1), (float)(mHeight*0.1), (float)(mWidth*0.9), (float)(mHeight*0.9));}

现在是矩形的背景有了,那么,还有环形跟文字又怎么去处理呢,别着急,我们先看看这个环形,我这里之所以定义两个环形,是因为,一个用作进度去显示,一个当做背景去实现,好了,分别绘制两个环形。代码如下:

    canvas.drawArc(mRectF, 90, 360, false, mButtomPaint);canvas.drawArc(mRectF, 15, 180, false, mTopPaint);

两个环形也有了,接下来就是文字了,绘制文字我们使用canvas.DrawText方法,去绘制,具体代码如下:

canvas.drawText("5.0", (mWidth-(mTextWidth+mTextSmail))/2, (float)(mHeight/2), mTextPaint);canvas.drawText("天", (mWidth-(mTextWidth+mTextSmail))/2+mTextWidth, (float)(mHeight/2), mSmailTextPaint);canvas.drawText("升级年费超级会员立即升至", (mWidth-mTextSmailButtom)/2, (float)(mHeight/2+30), mSmailTextPaint);

这下全部的效果也出来了,最后,我贴上所有的代码:

public class MyProgress extends View {private Paint mButtomPaint;private Paint mTopPaint;private Paint mTextPaint;private Paint mSmailTextPaint;private float mWidth;private float mHeight;private RectF mRectF;public MyProgress(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView();}public MyProgress(Context context, AttributeSet attrs) {super(context, attrs);initView();}public MyProgress(Context context) {super(context);initView();}private void initView() {mButtomPaint=new Paint();mButtomPaint.setColor(Color.rgb(69, 142, 253));mButtomPaint.setAntiAlias(true);mButtomPaint.setStrokeWidth(10);mButtomPaint.setStyle(Style.STROKE);mTopPaint=new Paint();mTopPaint.setColor(Color.parseColor("#ffffff"));mTopPaint.setAntiAlias(true);mTopPaint.setStrokeWidth(10);mTopPaint.setStyle(Style.STROKE);mTextPaint=new Paint();mTextPaint.setColor(Color.WHITE);mTextPaint.setAntiAlias(true);mTextPaint.setStrokeWidth(5);mTextPaint.setTextSize(50);mSmailTextPaint=new Paint();mSmailTextPaint.setStrokeWidth(3);mSmailTextPaint.setColor(Color.WHITE);mSmailTextPaint.setAntiAlias(true);mSmailTextPaint.setTextSize(15);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mWidth=getWidth();mHeight=getHeight();mRectF=new RectF((float)(mWidth*0.1), (float)(mHeight*0.1), (float)(mWidth*0.9), (float)(mHeight*0.9));}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawArc(mRectF, 90, 360, false, mButtomPaint);canvas.drawArc(mRectF, 15, 180, false, mTopPaint);float mTextWidth=mTextPaint.measureText("5.0");float mTextSmail=mSmailTextPaint.measureText("天");float mTextSmailButtom=mSmailTextPaint.measureText("升级年费超级会员立即升至");canvas.drawText("5.0", (mWidth-(mTextWidth+mTextSmail))/2, (float)(mHeight/2), mTextPaint);canvas.drawText("天", (mWidth-(mTextWidth+mTextSmail))/2+mTextWidth, (float)(mHeight/2), mSmailTextPaint);canvas.drawText("升级年费超级会员立即升至", (mWidth-mTextSmailButtom)/2, (float)(mHeight/2+30), mSmailTextPaint);}}

谢谢阅读。更多技术,可以关注我的其他文章,谢谢支持。

Android自定义View——仿QQ等级天数进度相关推荐

  1. 自定义View | 仿QQ运动步数进度效果

    项目GitHub地址 思路 固定不动的蓝色大圆弧 动画变动的红色小圆弧 中间的步数文字显示 相关的自定义属性 比如固定不动的大圆弧, 我们不能写死他的蓝色颜色属性, 要提供一个颜色的自定义属性给用户自 ...

  2. android的动态tab,Android自定义view仿QQ的Tab按钮动画效果(示例代码)

    话不多说 先上效果图 实现其实很简单,先用两张图 一张是背景的图,一张是笑脸的图片,笑脸的图片是白色,可能看不出来.实现思路:主要是再触摸view的时候同时移动这两个图片,但是移动的距离不一样,造成的 ...

  3. oracle number型步数,Android自定义View仿QQ计步器

    自定义计步器 Android自定义View是Android开发中比较重要的一项,也是很多开发者比较怕的一个东西.其实只要认真去学习,自定义View其实没有那么可怕:相反的,我们还能从自定义View中找 ...

  4. 自定义View 仿QQ运动步数进度效果

    1. 概述   我记得QQ之前是有一个,运动步数的进度效果,今天打开QQ一看发现没有了.具体效果我也不清楚了,我就按照自己大概的印象写一下,这一期我们主要是熟悉Paint画笔的使用:    2. 效果 ...

  5. android自定义计步器形状,Android自定义View仿QQ运动步数效果

    本文实例为大家分享了Android QQ运动步数的具体代码,供大家参考,具体内容如下 今天我们实现下面这样的效果: 首先自定义属性: 自定义View代码如下: /** * Created by Mic ...

  6. Android自定义view仿QQ的Tab按钮动效

    话不多说 先上效果图 实现其实很简单,先用两张图 一张是背景的图,一张是笑脸的图片,笑脸的图片是白色,可能看不出来.实现思路:主要是再触摸view的时候同时移动这两个图片,但是移动的距离不一样,造成的 ...

  7. 自定义view 仿qq步数 半圆弧

    先看效果图: 自定义属性 <declare-styleable name="QQSteps"><attr name="roundWidth" ...

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

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

  9. 精通Android自定义View(十二)绘制圆形进度条

    1 绘图基础简析 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制 ...

  10. android 高仿 探探卡片滑动,Android自定义View仿探探卡片滑动效果

    Android自定义View仿探探卡片滑动这种效果网上有很多人已经讲解了实现思路,大多都用的是RecyclerView来实现的,但是我们今天来换一种实现思路,只用一个自定义的ViewGroup来搞定这 ...

最新文章

  1. GO Negotiation流程分析
  2. C_functions
  3. 【转】C#中的命名空间namespace全解
  4. 汇编指令速查手册(转)
  5. 蓝桥杯 ADV-88 算法提高 输出正反三角形
  6. 通过调用外部exe的方法实现c#调用java
  7. bzoj 1040: [ZJOI2008]骑士
  8. Minimum edit distance(levenshtein distance)(最小编辑距离)初探
  9. Unity3D加载资源的四种方式
  10. [Excel]VBA编程入门基础知识
  11. win10电池图标不能调亮度_win10电池图标下面的亮度调节用不了
  12. p106矿渣做深度学习踩过的那些坑
  13. 苹果手机开机一会显示无服务器,苹果手机出现无信号的解决方法
  14. 和差角证明托勒密定理
  15. CVE-2019-16097:Harbor任意管理员注册漏洞复现
  16. 软件工程课程周学习进度报告——第四周
  17. python姿态检测实现多人多姿态识别python行为识别openpose行为骨骼框架检测动作识别动作检测行为动作分类
  18. 操作系统:模拟售票功能
  19. dockers 后台启动
  20. adb wifi连接android设备

热门文章

  1. 大学计算机基础贾宗璞答案,大学计算机应用基础C教学大纲
  2. 反客为主?00 后大学生 “反向背调” 雇主,Z 世代要重塑职场
  3. 高盛发布区块链报告:从理论到实践(中文版)五
  4. Android主界面退出再次进入略过欢迎面
  5. 一、jsp和Servlet基础理论及jstl和EL表达式用法
  6. heka 输出到mysql_让Heka支持lua的io操作和os操作
  7. 面试时,如何正确介绍自己的项目经验?
  8. 聊聊如何申请技术专利
  9. 图片上传之blob对象预览
  10. vs2015遇见问题:后面有“::”的名称一定是类名或命名空间名