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. 【转】Android LCD(一):LCD基本原理篇

    关键词:android LCD TFT 液晶 偏光片 彩色滤光片  背光 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exyno ...

  2. UP UP UP!(dp)

    UP UP UP! Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 92  Solved: 27SubmitStatusWeb Board Descri ...

  3. 计算机管理cmd命令行

    给你一个资料,想必对你来讲有保存价值: 开始菜单中的“运行”是通向程序的快捷途径,输入特定的命令后,即可快速的打开Windows的大部分程序,熟练的运用它,将给我们的操作带来诸多便捷. winver ...

  4. mysql的基本使用方法

    创建数据库:create database [if not exist]name [character set 编码方式 collate 校对规则] 显示库的创建信息:show create data ...

  5. 《你必须知道的495个C语言问题》知识笔记及补充

    1. extern在函数声明中是什么意思? 它能够用作一种格式上的提示表明函数的定义可能在还有一个源文件里.但在 extern int f(); 和 int f(); 之间并没有实质的差别. 补充:e ...

  6. wamp安装

    下载之后双击文件进行安装选择:I accept the agreement ,点击Next. 一直单击NEXT 安装完成后运行wamp,在桌面右下角即会出现wamp的图标,图标最初是红色的,然后变为橙 ...

  7. c++如何生成随机数

    一.使用rand()函数 头文件<stdlib.h> (1)  如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_ ...

  8. dojo.byId、dojo.query、dojo.attr

    概述: dojo.byId(/*string*/id或/*DomNode*/node) 1.传入DOMNode返回传入的domNode; 2.传入id返回id为当前值的domNode dojo.que ...

  9. 对WEB标准以及W3C的理解与认识 - 提高网页加载速度

    在写代码的时候应该注意: 1.标签闭合 2.标签小写 3.不能随意嵌套 提高被搜索引擎搜到几率: mate中的name变量[其中keywords和description尤其重要] Meta name= ...

  10. JavaScript鼠标事件,点击鼠标右键,弹出div

    document.oncontextmenu = function(){return false}; //禁止鼠标右键菜单显示 var res = document.getElementById('b ...