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 blocke.printStackTrace();}}running = false;}};mProgress.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif(!running) {progress = 0;mProgress.resetCount();mThread = new Thread(r);mThread.start();}}});}
5、完整的工程请下载:CustomArc

Wheel ProgressBar 实现之三——模拟进度过程相关推荐

  1. C# ProgressBar用法:模拟进度条

     在不考虑复杂情况下,我们可以采用不安全的线程调用,即允许子线程操作主线程里的控件状态,在初始化的时候后,加上这么一句: Control.CheckForIllegalCrossThreadCal ...

  2. 《物联网Android程序开发案例式教程》Demo4:模拟进度条

    在日常的应用中,我们经常会下载App.文件等,此时,就需要进度条来提示我们下载进度.这一章将教大家如何模拟下载进度条效果. 本案例需要用到的控件有显示图片的ImageView. 进度条控件Progre ...

  3. Sysweld笔记:利用稳态算法加速算法模拟焊接过程的残余应力

    作者:贾亚波博士,仿真秀专栏作者 在进行热力耦合的仿真过程中,如果模型足够的长并且热源速度恒定,通常其热学,相变以及热力耦合都会达到稳态的过程,因此如何直接计算稳态问题成为了大家研究的热点问题. 由于 ...

  4. java小车赛跑_Java模拟赛跑过程

    Java并发面试中的一个经典问题--手写代码模拟赛跑过程.该问题考查CountDownLatch的用法,比Java实现生产者-消费者模型的考查更直接: 对Java并发模型的理解 对Java并发编程接口 ...

  5. Python模拟ARCH过程

    模拟ARCH过程可以更加深入了解导致波动聚团现象的原因是什么. 以ARCH(1)模型为例 代码如下: """ Created on Thu Oct 18 23:41:00 ...

  6. java progressbar swt_Eclipse-SWT学习之进度条的SWT实现

    图示: package ProgressBar; import java.awt.DisplayMode; import org.eclipse.swt.SWT; import org.eclipse ...

  7. 365. 水壶问题-暴力模拟倒水过程-递归法

    365. 水壶问题-暴力模拟倒水过程-递归法 有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升.水的供应是无限的.确定是否有可能使用这两个壶准确得到 targetCa ...

  8. 【转】 浏览器分析模拟登陆过程

    原文地址:http://www.crifan.com/use_ie9_f12_to_analysis_the_internal_logical_process_of_login_baidu_main_ ...

  9. MATLAB模拟导热过程,一维热传导MATLAB模拟.doc

    PAGE 昆 明 学 院 2015 届毕业设计(论文) 设计(论文)题目 一维热传导问题的数值解法及其MATLAB模拟 子课题题目 无 姓 名 伍有超 学 号 201117030225 所 属 系 物 ...

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

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

最新文章

  1. Transformers包tokenizer.encode()方法源码阅读笔记
  2. 人脸静默活体检测最新综述
  3. html选项卡_适用于Mac的最佳HTML文本编辑器,编码开发必备
  4. win11在dev渠道升级怎么保留原来的文件 windows11渠道升级保留原文件的方法步骤
  5. Nginx源码分析 - 核心模块初始化顺序,根据ctx创建上下文
  6. python小论文范文3000字_完整的论文范文3000字 [论文的名字 ]
  7. 最新黑马软件测试全套视频教程
  8. python实现邻接矩阵转邻接表
  9. Oracle账户被锁定后如何解锁
  10. Smobiler资料准备与环境搭建——C# 或.NET Smobiler实例开发手机app(一)
  11. 动画 | 什么是红黑树?(与2-3树等价)
  12. 电脑计算机找不到指定的程序,光驱双击显示找不到应用程序。怎么办?
  13. balsamiq mockups 注册
  14. 限流的抖音号怎么养?养号方法是什么?
  15. “代理服务器出现问题,或者地址有误”解决方案
  16. 油猴相关玩法-下载,脚本下载
  17. Socket 和 ServerSocket
  18. vim安装配置coc.vim实现语言的自动补全
  19. 关键字 - restrict
  20. csdn python 培训 价格

热门文章

  1. Hotel 旅馆 题解(From luoguBlog)
  2. 如何使用python将二维数组去重呢?
  3. TableView载入WebView的一些小技巧 By 徐
  4. 今天起改用mac的marsedit写博
  5. DescribingDesign Patterns 描述设计模式
  6. 介绍几种jquery ui使用方法
  7. Disruptor 极速体验
  8. Netty4.0学习笔记系列之三:构建简单的http服务
  9. 详解java定时任务
  10. 使用apache benchmark(ab) 测试报错: apr_socket_recv: Connection timed out (110)