1. 效果展示:

知道如何画圆弧,如何精确画出进度文本之后,我们将进入 Wheel ProgressBar 实现的最后一个过程:模拟其动态呈现过程。如下图所示,初始时显示进度为 0 (上图),点击进度条后,将自动减速加载(下图),每次点击之后都将重新从 0 加载到 100。 



2. 实现原理:
通过以下几个步骤来实现进度的动态加载:
1、画一个灰色圆环;
2、通过当前的进度(百分数)计算得到当前应该画的弧度(蓝色);
3、画出当前进度弧;
4、画出进度文本。

3. 具体实现:
如何画弧和进度文本不再赘述:
1、画一个灰色圆环,可以通过两种方法实现:

第一种是直接画出一个圆环,采用 Canvas.drawCircle() 接口,设置圆心、半径和画笔:

canvas.drawCircle(this.getWidth() / 2,
this.getHeight() / 2,
(mRectBounds.width() - mArcWidth)/2,
mRimPaint);
第二种是画一个 360 度的圆弧:
canvas.drawArc(mArcBounds, 360, 360, false, mRimPaint);
以上两种方法都在 View 重写的 onAttachedToWindow() 方法中实现。

2、通过当前的进度(百分数)计算得到当前应该画的弧度(蓝色):

mDegree = Math.round( ((float)mProgress / 100) * 360 );
mProgress 为当前的进度,mDegree 为计算得到的当前弧度
3、画出当前弧度:
通过在主线程中调用 View.invalidate() 方法触发 View 的重绘操作,具体是调用 onDraw(), 所以当前弧度在 onDraw() 中绘制:

canvas.drawArc(mArcBounds, -90, mDegree, false, mArcPaint);
mDegree 即为上一步计算得到的弧度。
4、Activity 中的实现:
这里我们开启了一个工作线程,减速实现进度的刷新,并实现进度点击后的重新加载。注意 mProgress.setProgress() 方法,在这个方法中我们实现的就是通过进度计算弧度的操作,并通过 invalidate 重绘。


protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mProgress = (CustomArc) findViewById(R.id.progress); final Runnable r = new Runnable() {
public void run() {
running = true;
while(progress<101) {
mProgress.setProgress(progress);
progress++;
try {
Thread.sleep(10 + progress);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
running = false;
}
}; mProgress.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(!running) {
progress = 0;
mProgress.resetCount();
mThread = new Thread(r);
mThread.start();
}
}
});
}
5、完整的工程请下载:CustomArc


Wheel ProgressBar 实现之三——模拟进度过程的更多相关文章

  1. Android ProgressBar实现加载进度条

    progressBar Android进度条组件.   progressBar的关键属性:      android:max="100"     最大显示进度条      andr ...

  2. C#模拟进度条

    自己看源码 using System; namespace ConsoleTest { class Program { static void Main(string[] args) { Consol ...

  3. 使用Geth 构建以太坊区块链并模拟挖矿过程

    使用Geth 构建以太坊区块链并模拟挖矿过程 Go-ethereum 是以太坊官方的一个Golang 实现,我们可以使用Geth 工具来创建创世区块并启动区块链,使用Clef 实现以太坊钱包的功能,以 ...

  4. EasyUI基础searchbox&amp;progressbar(搜索框,进度条)

    easyui学习的基本组成部分(八个部分)硕果仅存searchbox和pargressbar.tooltip该,有一点兴奋.本文将偏向searchbox和pargressbar做一个探讨.鉴于双方的内 ...

  5. C# 根据BackgroundWoker异步模型和ProgressBar控件,自定义进度条控件

    前言 程序开发过程中,难免会有的业务逻辑,或者算法之类产生让人能够感知的耗时操作,例如循环中对复杂逻辑处理;获取数据库百万乃至千万级数据;http请求的时候等...... 用户在使用UI操作并不知道程 ...

  6. progressbar使用方法:进度画面大小,进度画面背景,进度百分比

    前一段时间,因为项目须要研究了下progressbar,发现这个小东西还真是不简单.在这个小控件的显示效果上,花费的时间远大于预估的工作量.话说程序猿一直是这样,预估的工作量远少于实际...      ...

  7. Python多线程同步命令行模拟进度显示

    最近在一个Python(3.5)的小项目中需要用到多线程加快处理速度,同时需要显示进度,于是查了些资料找到几个实现方法:线程池的map-reduce和Queue结合线程的实现.这里简单的实例介绍一下Q ...

  8. ATK&CK红队评估实战靶场 (一)的搭建和模拟攻击过程全过程

    介绍及环境搭建 靶机地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2 官方靶机说明: 红队实战系列,主要以真实企业环境为实例搭建一系列靶场,通过练 ...

  9. 通过DIV+span方式模拟进度条的实现方法

    上上周用FusionCharts做报表时,有个图是进度条的形式,其实在FusionCharts 3.0之后已经支持了(Linear Gauge),可惜现有系统用的还是1.2.3版本的,重新引入新版本有 ...

随机推荐

  1. 六度分离(floyd算法+dijskra+SPFA)

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. 算法设计手冊(第2版)读书笔记, Springer - The Algorithm Design Manual, 2ed Steven S.Skiena 2008

    The Algorithm Design Manual, 2ed 跳转至: 导航. 搜索 Springer - The Algorithm Design Manual, 2ed Steven S.Sk ...

  3. ThinkPHP中的__initialize()和类的构造函数__construct()

    ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不对 ...

  4. python 笔记3--高级特性

    切片 语法 L[l:r] 取L[l],L[l+1]-L[r-2],L[r-1] L[l:r:m] 取L[l],L[l+m],L[l+2*m],L[l+3*m]-.(满足l+n*m<=r-1) t ...

  5. Android显示系统设计框架介绍

    1. Linux内核提供了统一的framebuffer显示驱动,设备节点/dev/graphics/fb*或者/dev/fb*,以fb0表示第一个显示屏,当前实现中只用到了一个显示屏. 2. Andr ...

  6. C# 枚举运用"位"操作和"或"操作

    定义: /// <summary> /// The js function type(the same as name). /// </summary> [Flags] pub ...

  7. 让资源可以下载a

    第一种方式------不存在任何兼容性 <a href='x.zip'>下载</a> 将要链接的资源进行打包即可 第二种方式----存在兼容性,目前只有Chrome 和Fire ...

  8. 读取本地文件理解FileReader对象的方法和事件以及上传按钮的美化。

    一.FileReader对象 用来把文件读入内存,并且读取文件中的数据.FileReader对象提供了异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据. 浏览器支持情况, ...

  9. jfreechart中文乱码问题解决方案(转)

    参考网址:http://zhidao.baidu.com/link?url=y88rR1_aAHaFofonx9o_IaEu87MpkTQImsqDcy587eG55JkfQV6EzzzloIgXuQ ...

  10. 【转】SSIS 2012 – Package Configurations Menu Option Missing

    原文:http://dataqueen.unlimitedviz.com/2012/01/ssis-2012-package-configurations-menu-option-missing/ I ...