圆形进度条以及百分率指示器 Scroller类的练习

转载时请注明出处,尊重他人的劳动成果,谢谢。

先附上效果图:


这个控件是动态加载到75%的,主要我忘了怎么做动态图,就先放一个静态图在这里表示表示。旁边这个没有没有喜欢的?有想知道的 我可以告诉答案。

现附上代码,不懂的请留言:

package com.sahadev.circleview;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Scroller;public class CircleView extends View implements OnClickListener {private Paint outPaint, inPaint;/* The Circle's radius */private int radius = 200;/* The torus's width */private int width = 50, backgroundColor = Color.WHITE;// 默认 背景色为纯白private RectF mTempRectF = new RectF();private int mProgress;// 当前进度private int mTargetProgress = 75;// 目标进度private int mWidth = 400, mHeight = 400;// 该控件的初始大小为400*400private Scroller mScroller;// 滑动辅助类private int duration = 1000;// 动画间隔时间private int textSize = 50, mFontHeight;private float mTextWidth = 0;public CircleView(Context context) {this(context, null);}public CircleView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public CircleView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);outPaint = new Paint();inPaint = new Paint();outPaint.setTextSize(textSize);mScroller = new Scroller(context);mScroller.forceFinished(false);outPaint.setColor(Color.argb(90, 90, 90, 90));outPaint.setStyle(Paint.Style.FILL_AND_STROKE);outPaint.setAntiAlias(true);inPaint.setColor(backgroundColor);inPaint.setAntiAlias(true);setBackgroundColor(backgroundColor);FontMetrics fm = outPaint.getFontMetrics();// 得到系统默认字体属性mFontHeight = (int) (Math.ceil(fm.descent - fm.top) + 2);// 获得字体高度mFontHeight = mFontHeight - textSize;mTempRectF.set(0, 0, mWidth, mHeight);}public void setTextSize(int textSize) {this.textSize = textSize;}/** 设置背景色* * @see android.view.View#setBackgroundColor(int)*/public void setBackgroundColor(int color) {this.backgroundColor = color;}/*** 设置圆圈颜色* * @param color*/public void setCircleColor(int color) {outPaint.setColor(color);}/*** 设置圆圈半径* * @param radius*/public void setRadius(int radius) {this.radius = radius;}/*** 设置圆圈宽度* * @param width*/public void setWidth(int width) {this.width = width;}/*** 设置目标进度* * @param progress*            大于0,小于100*/public void setTargetProgress(int progress) {this.mTargetProgress = progress;}/*** 可以作为进度条设置当前进度* * @param progress*/public void setProgress(int progress) {this.mProgress = progress;postInvalidate();}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:onClick(this);return true;}return super.onTouchEvent(event);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawArc(mTempRectF, -90, 360 * mProgress / 100, true, outPaint);// 画一个扇形canvas.drawCircle(mWidth / 2, mHeight / 2, radius - width, inPaint);// 中心画一个圆mTextWidth = outPaint.measureText(mProgress + "%");canvas.drawText(mProgress + "%", (mWidth - mTextWidth) / 2, (mHeight) / 2 + mFontHeight, outPaint);}/** 获取适合的高宽* * @see android.view.View#onMeasure(int, int)*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int size = 0;size = widthMeasureSpec > mWidth && heightMeasureSpec > mHeight ? (mWidth > mHeight ? mHeight : mWidth) : (widthMeasureSpec > heightMeasureSpec ? heightMeasureSpec: widthMeasureSpec);/* 该控件为正方形 */setMeasuredDimension(size, size);}/** 触动该控件 绘制到指定位置* * @see android.view.View.OnClickListener#onClick(android.view.View)*/@Overridepublic void onClick(View v) {mScroller.startScroll(0, 0, mTargetProgress, 0, duration);postInvalidate();}/*** 设置动画绘制时间* * @param duration*/public void setDuration(int duration) {this.duration = duration;}@Overridepublic void computeScroll() {super.computeScroll();if (mScroller.computeScrollOffset()) {mProgress = mScroller.getCurrX();postInvalidate();}}}


像一般自定义控件使用这个控件就可以了,具体方法相信大家都懂得,我就不贴方法了,只用设置进去就可以看到效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解

本文涉及的内容以及知识点如下: 1、单体架构 2、单体架构的拆分 3、SOA与微服务的区别 4、微服务的优缺点 5、微服务的消息 6、服务集成 7、数据的去中心化 单体架构 Web应用程序发展的早期,大部分web工程是将所有的功能模块(service…

我拿乐谱训了个语言模型!

文 | 花椒最近在刷EMNLP论文的时候发现一篇非常有趣的论文《Learning Music Helps You Read: Using Transfer to Study Linguistic Structure in Language Models》,来自斯坦福大学NLP组。论文有趣的发现是让语言模型先在乐谱上进行训练,再在自然语言上训…

带你根据源码了解View的事件触发流程,主要讲解为什么子View返回true,ViewGroup就无法接收到事件的过程

转载请标明出处!http://blog.csdn.net/sahadev_/article/details/23839039 ,当然一般也没人转载。。。 一直想彻底了解View的事件分发过程,在网上也看了很多大神的博客,但是总有一些东西不是很明白,于是自己就根据源码画了一个流程…

LeetCode 146. LRU缓存机制(哈希链表)

文章目录1. 题目信息2. 解题2.1 手动实现list2.2 使用内置list1. 题目信息 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓…

268G+训练好的word2vec模型(中文词向量)

268G训练好的word2vec模型(从网上了解到,很多人缺少大语料训练的word2vec模型,在此分享下使用268G语料训练好的word2vec模型。

微服务系列:服务注册与发现的实现原理、及实现优劣势比较

服务注册与发现的来源 首先,服务注册与发现是来自于微服务架构的产物。 在传统的服务架构中,服务的规模处于运维人员的可控范围内。当部署服务的多个节点时,一般使用静态配置的方式实现服务信息的设定。而在微服务应用中,服务实例…

EMNLP 2020论文分析:知识图谱增强语言模型或是未来的发展趋势!

文 | Michael Galkin源 | AI科技评论在EMNLP 2020的论文投递中,知识图谱的研究热度不减,并成为继续推动NLP发展的重要动力之一。在EMNLP 2020中,知识图谱领域有了哪些最新研究进展呢?作者从中选出了30篇文章,对未来2-3…

如何通过反射来解决AlertDialog标题由于字数过多显示不全的问题

转载前请标明出处:http://blog.csdn.net/sahadev_ 先上一下示例图: 这是默认状态下:这是通过反射后修改的结果: 在解决这个问题之前首先需要了解一下AlertDialog的基本构造,所以先从源码看起: 想要知道为什么显示不…

LeetCode 292. Nim 游戏

文章目录1. 题目信息2. 解题1. 题目信息 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人,每一步都是最优解。 编写一个函数…

基于TextRank算法的文本摘要(附Python代码)

基于TextRank算法的文本摘要(附Python代码): https://www.jiqizhixin.com/articles/2018-12-28-18

配送A/B评估体系建设实践

2019年5月6日,美团点评正式推出新品牌“美团配送”,发布了美团配送新愿景:“每天完成一亿次值得信赖的配送服务,成为不可或缺的生活基础设施。”现在,美团配送已经服务于全国400多万商家和4亿多用户,覆盖28…

ListView原理简单介绍(着重介绍getView被调用的一系列过程)

今天出去面试,被面试官问到一个问题,说是如果使用 LayoutInflate.inflate(int resource, ViewGroup root, boolean attachToRoot);这个方法与AbsListView的实现类结合使用的话,会出现什么问题,先看简单的使用过程: Ove…

一人之力,刷爆三路榜单!信息抽取竞赛夺冠经验分享

文 | JayLou娄杰在现如今的NLP竞赛中,信息抽取(IE)任务已占据半壁江山。来,让我们看看今年的一些IE竞赛都有啥:看到如此众多的IE竞赛,心动的JayJay抽空参加了CHIP2020(中国健康信息处理大会&…

NumPy快速入门--复制/视图/深拷贝

文章目录1. 完全不复制2. 视图或浅复制3. 深拷贝当计算和操作数组时,它们的数据有时被复制到新的数组中,有时不复制。对于初学者来说,这经常是一个混乱的来源。有三种情况:1. 完全不复制 简单赋值不会创建新的副本。 >>&g…

pkuseg:一个多领域中文分词工具包

pkuseg简单易用,支持细分领域分词,有效提升了分词准确度。 目录 主要亮点编译和安装各类分词工具包的性能对比使用方式相关论文作者常见问题及解答主要亮点 pkuseg具有如下几个特点: 多领域分词。不同于以往的通用中文分词工具,此…

积木Sketch Plugin:设计同学的贴心搭档

| A consistent experience is a better experience.——Mark Eberman | 一致的体验是更好的体验。——Mark Eberman 《摘自设计师的16句名言》 背景 1.UI一致性项目 积木(Tangram)Sketch插件源于美团外卖UI的一致性项目,该项目自2019年5月份…

简单讲述一下Intent的传值过程

昨晚带女友Android入门,她本是照着一本书敲得,可以运行,后来她自己凭思维自己写了一个,然后出现了值没有传过来的问题,然后简单的了解了一下Intent是如何传递数据的。 我们的例子是这样的: 由A Activity通…

何恺明团队:stop gradient是孪生网络对比学习成功的关键

文 | Happy源 | 极市平台本文是FAIR的陈鑫磊&何恺明大神在无监督学习领域又一力作,提出了一种非常简单的表达学习机制用于避免表达学习中的“崩溃”问题,从理论与实验角度证实了所提方法的有效性;与此同时,还侧面证实了对比学…

美团无人配送CVPR2020论文CenterMask解读

计算机视觉技术是实现自动驾驶的重要部分,美团无人配送团队长期在该领域进行着积极的探索。不久前,高精地图组提出的CenterMask图像实例分割算法被CVPR2020收录,本文将对该方法进行介绍。 CVPR的全称是IEEE Conference on Computer Vision an…

自然语言处理系列篇——关键词智能提取

自然语言处理系列篇——关键词智能提取:https://zhuanlan.zhihu.com/p/25889937