超简单仿QQ步数显示控件
本着写文即学习的态度,记录下自定义一款超简单仿QQ步数加载控件,话不多数先看图。
一,特性:
1,外圈大圆、进度圆和数字显示的颜色均可以自定义
2,设置最大值和当前值
3,设置加载持续时间
二,实现:
1,画外圈大圆
2,画内圈进度圆
3,画文字
在第二步与第三步要根据设置的最大值和当前值动态持续更新进行绘画,这里我使用valueAnimation获取中间值。
- 自定义属性
<declare-styleable name="CircleProgressView"><attr name="circle_process_stroke_width" format="dimension" /><attr name="circle_process_stroke_color" format="color" /><attr name="circle_process_progress_color" format="color" /><attr name="circle_process_text_color" format="color" /><attr name="circle_process_text_size" format="dimension" /><attr name="circle_process_duration" format="dimension"/></declare-styleable>
- 自定义CircleProgressView继承自view,获取属性值
private void initAttrs(AttributeSet attrs) {TypedArray attribute = getContext().obtainStyledAttributes(attrs, R.styleable.CircleProgressView);mCircleColor = attribute.getColor(R.styleable.CircleProgressView_circle_process_stroke_color, Color.BLUE);mProgressColor = attribute.getColor(R.styleable.CircleProgressView_circle_process_progress_color, Color.RED);mRoundWidth = (int) attribute.getDimension(R.styleable.CircleProgressView_circle_process_stroke_width, 1f);mTextColor = attribute.getColor(R.styleable.CircleProgressView_circle_process_text_color, 0XFFFC00D1);mTextSize = (int) attribute.getDimension(R.styleable.CircleProgressView_circle_process_text_size, 20f);mDuration = (long) attribute.getDimension(R.styleable.CircleProgressView_circle_process_duration,2000f);attribute.recycle();}
- 测量
@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {mViewWidth = MeasureSpec.getSize(widthMeasureSpec);mViewHeight = MeasureSpec.getSize(heightMeasureSpec);centerX = mViewWidth / 2;centerY = mViewHeight / 2;radius = Math.min(centerX, centerY) - mRoundWidth;//半径super.onMeasure(widthMeasureSpec, heightMeasureSpec);}
- 画外圈大圆
//画外圈大圆mPaint.setColor(mCircleColor);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(mRoundWidth);mPaint.setStrokeCap(Paint.Cap.ROUND);mPaint.setStrokeJoin(Paint.Join.ROUND);canvas.drawCircle(centerX, centerY, radius, mPaint);
- 画进度圆
//根据比值画进度圆mPaint.setColor(mProgressColor);RectF rectF = new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius);float curRadius = process * 360;canvas.drawArc(rectF, 90f, curRadius, false, mPaint);
- 画数字
//根据比值画文字mPaint.reset();mPaint.setAntiAlias(true);mPaint.setColor(mTextColor);mPaint.setTextSize(mTextSize);String text = (int) (process * mMaxNum) + "/" + (int) mMaxNum;Rect textBound = new Rect();mPaint.getTextBounds(text, 0, text.length(), textBound);int textStart = (mViewWidth - textBound.width()) / 2;Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();int baseLine = (int) (mViewHeight / 2 + (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom);canvas.drawText(text, textStart, baseLine, mPaint);
- 还有一个最重要的方法,开始动画,产生中间值,计算比值
/*** 开始动画** @param maxNum 最大值* @param curNum 当前值*/public synchronized void start(final float maxNum, float curNum) {if (maxNum <= 0)throw new IllegalArgumentException("maxNum 必须大于0");if (curNum < 0)throw new IllegalArgumentException("curNum 不能小于0");if (curNum > maxNum)throw new IllegalArgumentException("curNum 不能大于maxNum");mMaxNum = maxNum;ValueAnimator animator = ValueAnimator.ofFloat(0, curNum);animator.setDuration(mDuration);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float value = (float) animation.getAnimatedValue();//计算得到比值process = value / maxNum;invalidate();}});animator.start();}
至此功能已经初步完成了,可以另外提供一些方法方便使用
/*** 设置描边宽度** @param width*/public synchronized void setRoundWidth(int width) {if (width > 0) {mRoundWidth = width;}}/*** 设置动画执行时间,单位ms* @param duration*/public synchronized void setDuration(long duration) {if (duration > 0) {mDuration = duration;}}/*** 设置外圈大圆颜色** @param color*/public synchronized void setCircleColor(int color) {mCircleColor = color;}/*** 设置进度圆颜色** @param color*/public synchronized void setProgressColor(int color) {mProgressColor = color;}/*** 设置文字颜色** @param color*/public synchronized void setTextColor(int color) {mTextColor = color;}
大功告成,简单的功能实现,希望能抛砖引玉啦!
超简单仿QQ步数显示控件相关推荐
- Flutter | 超简单仿微信QQ侧滑菜单组件(改)
文章目录 一.明确需求 二.实现需求 1. 滑动菜单实现使用`SingleChildScrollView`: 2. 列表滑动不够距离则菜单再次隐藏,距离足够则完全展示菜单. 3. 菜单支持事件处理. ...
- android 仿ios三级联动,仿iOS的PickerView控件,有时间选择和选项选择并支持一二三级联动效果...
Android-PickerView 注意事项.详请使用方式.更新日志等,请查看 Wiki文档 Wiki文档,Wiki文档,Wiki文档 !~ 重要的事情说三遍 对于使用上有任何疑问或优化建议等,欢迎 ...
- 自定义LyricView实现歌词显示控件
声明:本博客转载自郭霖微信公众号,优秀博客值得多次转播. 地址http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236950&a ...
- WPF 动画显示控件
原文:WPF 动画显示控件 当我们要显示一个控件的时候,不仅仅要显示这个控件,还要有动画的效果. 主要用到了DoubleAnimation类. public static void ShowAnima ...
- 新瓶旧酒ASP.NET AJAX(1) - 简单地过一下每个控件(ScriptManager、ScriptManagerProxy
[索引页] [×××] 新瓶旧酒ASP.NET AJAX(1) - 简单地过一下每个控件(ScriptManager.ScriptManagerProxy.UpdatePanel. UpdatePro ...
- jquery网页日历显示控件calendar3.1使用详解
关于日历插件,我做了好多次尝试,一直致力于开发一款简单易用的日历控件.我的想法是争取在引用这个控件后,用一行js代码就能做出一个日历,若在加点参数,就能自定义外观和功能丰富多彩的日历.Calendar ...
- 显示控件——字符显示之艺术字
该控件主要是用于数据变量显示,与"数据变量"显示控件相似.不同的是,该控件使用图标艺术字作为字库,可以实现各种特殊的艺术字体的效果.在属性栏可以设置起始图标号,之后图片文字排列顺序 ...
- android lrc 歌词view,自定义View强势来袭,用自定义View实现歌词显示控件下篇之自定义LyricView的实现...
在上篇中,我与大家分享了关于如何进行*.lrc歌词文件的解析,以及将解析完成后的歌词展示在镶嵌在ScrollView中的TextView上,就这样而言,一个简单的歌词显示功能也就实现了. 但是,如何才 ...
- android 仿照ios 图片选择,GitHub - wildma/PictureSelector: Android 图片选择器(仿 IOS 图片选择控件)...
PictureSelector Android 图片选择器(仿 IOS 图片选择控件) 效果图 功能特点 支持通过拍照获取图片 支持通过相册获取图片 支持图片是否裁剪两种场景 支持仿 IOS 底部弹出 ...
最新文章
- poj 3321 Apple Trie
- 如何手工删除AD RMS SCP?
- 内存储器和cpu一起构成了计算机,计算机系统的组成
- PIC32单片机harmony开发环境 - uart例程和代码分析
- 关系数据库——mysql数据类型大总结
- 数据库连接池的原理没你想得这么复杂
- 常用html字符的转义字符串(html代码),全部转义字符备用
- 飞鸽传书程序IT基础架构和应用的管理
- 初学者python笔记(元组、字典、集合详解)
- asp.net中涉及子文件夹的母版页和相对路径文件引用问题(一)
- 蓝牙协议分析工具Wireshark/Frontline/Ellisys的使用
- 浏览器引擎系列:Webkit
- JZOJ 6841. 【2020.11.5提高组模拟】淘淘蓝蓝之树林(凸包+最短路)
- 苹果手机网页上点击数字可能拨打电话的解决办法
- 计算机怎样发现路由器上u盘,360 P2 无线路由器通过电脑终端查看路由USB存储设备操作流程 路由器...
- 软考:软件设计师(中级)--学习笔记02操作系统基本原理
- 【flutter】按钮,添加圆角
- 蓝字冲销是什么意思_在记账凭证中冲销是什么意思
- Lammps实现水分子在纳米颗粒球表面的吸附行为
- python访问复数的实部,虚部和模值