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. JS~delegate与live

    在jquery里有两个方法可以用来绑定自动追加出来的DOM对象,它们是live和delegate,事实上,这两个方法是bind方法的一个变体,在对于固定DOM对象时,我们通常使用bind就可以了,而对 ...

  2. 3 x 8 = 23(火了)

    颜回爱学习,德性又好,是孔子的得意门生.一天,颜回去街上办事,见一家布店前围满了人.他上前一问,才知道是买布的跟卖布的发生了纠纷. 只听买布的大嚷大叫:「三八就是二十三,你为啥要我二十四个钱?」颜回走 ...

  3. ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug

    ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug 近日发现eWebEditor V2.8 asp 版本上传文件文件名不能包含中文双引号,发现eWebEditor使用ASP“无惧上 ...

  4. mysql密码忘记如何处理

    1,修改/etc/my.cnf添加添加skip-grant参数,重启mysql. 2,登录mysql  mysql -uroot 3, 更新user中root的密码  use mysql;   upd ...

  5. 易语言转C#小试牛刀

    呵呵,用了几年的易语言,太郁闷了,玩过E的童鞋们懂得,偶然机会尝试C#,现正式投入C#门下. 我会把我学习C#的一些知识和重点,实时发不到我的BLOG中,同想学习C#的童鞋一起成长起来.

  6. 利用JPEGImageEncoder进行简单的图片压缩

    import java.awt.Dimension; import java.awt.Image; import java.awt.image.BufferedImage; import java.i ...

  7. HDU-1049

    Description An inch worm is at the bottom of a well n inches deep. It has enough energy to climb u i ...

  8. 判断浏览器IE6

    <!--[if lte IE 6]><LINK rel="stylesheet" type="text/css" href="ima ...

  9. Python的tkinter和tkinter.messagebox应用-鼠标和键盘命令绑定

    __author__ = 'Administrator' from tkinter import * import tkinter.messagebox class MainWindow: def b ...

  10. xml文件的解析

    1. xml文件的解析 void CDataMgr::readStringData() { std::string xml_name = "config/string.xml"; ...