Android ProgressBar 之源码解析及扩展应用!
转载请注明出处:
http://blog.csdn.net/crazy1235/article/details/74194504
setProgress(int progress)
@android.view.RemotableViewMethod
public synchronized void setProgress(int progress) {
setProgressInternal(progress, false, false);
public void setProgress(int progress, boolean animate) {
setProgressInternal(progress, false, animate);
@android.view.RemotableViewMethod
synchronized boolean setProgressInternal(int progress, boolean fromUser, boolean animate) {
if (mIndeterminate) {
return false;
progress = MathUtils.constrain(progress, 0, mMax);
if (progress == mProgress) {
return false;
mProgress = progress;
refreshProgress(R.id.progress, mProgress, fromUser, animate);
return true;
private synchronized void refreshProgress(int id, int progress, boolean fromUser,
boolean animate) {
if (mUiThreadId == Thread.currentThread().getId()) {
doRefreshProgress(id, progress, fromUser, true, animate);
} else {
if (mRefreshProgressRunnable == null) {
mRefreshProgressRunnable = new RefreshProgressRunnable();
final RefreshData rd = RefreshData.obtain(id, progress, fromUser, animate);
mRefreshData.add(rd);
if (mAttached && !mRefreshIsPosted) {
post(mRefreshProgressRunnable);
mRefreshIsPosted = true;
private synchronized void doRefreshProgress(int id, int progress, boolean fromUser,
boolean callBackToApp, boolean animate) {
final float scale = mMax > 0 ? progress / (float) mMax : 0;
final boolean isPrimary = id == R.id.progress;
if (isPrimary && animate) {
final ObjectAnimator animator = ObjectAnimator.ofFloat(this, VISUAL_PROGRESS, scale);
animator.setAutoCancel(true);
animator.setDuration(PROGRESS_ANIM_DURATION);
animator.setInterpolator(PROGRESS_ANIM_INTERPOLATOR);
animator.start();
} else {
setVisualProgress(id, scale);
if (isPrimary && callBackToApp) {
onProgressRefresh(scale, fromUser, progress);
private void setVisualProgress(int id, float progress) {
mVisualProgress = progress;
Drawable d = mCurrentDrawable;
if (d instanceof LayerDrawable) {
d = ((LayerDrawable) d).findDrawableByLayerId(id);
if (d == null) {
d = mCurrentDrawable;
if (d != null) {
final int level = (int) (progress * MAX_LEVEL);
d.setLevel(level);
} else {
invalidate();
onVisualProgressChanged(id, progress);
ProgressBar是进度条控件,ProgressBar的应用场景很多,比如用户登录时,后台发送请求,以及进行等待服务器返回信息等一些比较耗时的操作。这个时候如果没有提示,用户可能会以为程序崩溃了或手机死机了,会大大降低用户体验,所有在需要进行耗时操作的地方,添加上进度条,让用户知道当前的程序正在执行,也可以直观地告诉用户当前任务的执行进度。在使用ProgressBar控件时,我们经常要控制它的消失和显示,这时可以设置visibility属性。gone:表示控件不可见,但不会占用原来的位置和大小。
本文将分别从 ProgressBar 的属性、用法、源码分析、自定义四个方面对 ProgressBar 进行全面的介绍,希望对读者有一定的帮助,欢迎提出任何的疑问或者错误。
在程序开发中,ProgressBar提供了可以向用户展示当前任务的进度。
1. 在学习之前,我们先了解一些相关知识,查看api文档 progressBar。一般最常用的方法有以下几点:
getMax() 得到最大刻度
getProgress() 得到刻度
setMax(int max) 设置最大刻度
setProgress(int progress) 设置刻度
setSeco
ProgressBar是Android下的进度条,也是为数不多的直接继承于View类的控件,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBarProgressBar的使用注意:1、ProgressBar有两个进度,一个是android:progress,另一个是android:secondaryPr...
ProgressBar是Android下的进度条,也是为数不多的直接继承于View类的控件,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar
ProgressBar的使用注意:
1、ProgressBar有两个进度,一个是android:progress,另一个是android:seconda...
分析:此控件与系统标准的进度条控件相比,尖角的显示会是一个比较麻烦的事。如果采用系统的shape的方式定义,进度条进度进度一般是直角,或者是圆角。特殊样式,9宫格drawable对象的的拉升也能实现。但是相对于多种样式的变化,相对又比...
本文主要是记录ProgressBar源码的学习过程
先介绍一下学习源码的工具,工欲善其事必先利其器嘛,
Android SDK search,google浏览器插件,启用插件,然后进入官网:
查找ProgressBar