当前位置: 首页 > news >正文

锡林浩特网站建设微信开发兰州网站建设优化制作公司

锡林浩特网站建设微信开发,兰州网站建设优化制作公司,微信手机官网登录入口注册,德城区建设局网站ProgressBar 是 Android 中用于显示进度条的控件,它可以用来表示任务的完成程度或者加载进度等信息。ProgressBar 有两种主要类型:一种是确定性的(determinate),另一种是不确定性的(indeterminate&#xff…

ProgressBar 是 Android 中用于显示进度条的控件,它可以用来表示任务的完成程度或者加载进度等信息。ProgressBar 有两种主要类型:一种是确定性的(determinate),另一种是不确定性的(indeterminate)。确定性进度条有一个明确的最大值,而不确定性进度条则通常用来表示正在进行的任务,没有明确的结束时间。

下面我们将结合源码来分析 ProgressBar 的实现原理。

1. ProgressBar 类定义

ProgressBar 是一个自定义的 View,它继承自 View 并实现了 Drawable.Callback 接口。

1public class ProgressBar extends View implements Drawable.Callback {
2    // ...
3}

2. 构造函数

ProgressBar 的构造函数接受 ContextAttributeSetint 类型的默认样式参数。

1public ProgressBar(Context context) {
2    this(context, null);
3}
4
5public ProgressBar(Context context, AttributeSet attrs) {
6    this(context, attrs, android.R.attr.progressBarStyle);
7}
8
9public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
10    super(context, attrs, defStyleAttr);
11    init(context, attrs, defStyleAttr, 0);
12}

3. 初始化

init 方法用于初始化 ProgressBar 的样式和行为。

1private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
2    // ...
3    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ProgressBar, defStyleAttr, defStyleRes);
4    // ...
5    // 读取样式属性
6    mMax = a.getInt(R.styleable.ProgressBar_max, 100);
7    mProgress = a.getInt(R.styleable.ProgressBar_progress, 0);
8    // ...
9    a.recycle();
10    // 初始化绘制器
11    mIndeterminateProgressDrawable = new IndeterminateProgressDrawable(context, this, a);
12    mProgressDrawable = new ProgressDrawable(context, this, a);
13    // 设置默认的绘制器
14    setProgressDrawable(mProgressDrawable);
15    // ...
16}

4. 设置样式

ProgressBar 支持通过 XML 属性来设置样式。

1<ProgressBar
2    android:id="@+id/progress_bar"
3    android:layout_width="wrap_content"
4    android:layout_height="wrap_content"
5    android:indeterminate="true"  // 不确定性进度条
6    android:max="100"             // 最大值
7    android:progress="50"         // 当前进度
8    android:secondaryProgress="80" // 第二进度
9    android:background="#FF0000"  // 背景颜色
10    android:progressDrawable="@drawable/custom_progress_drawable" />

5. 设置进度

ProgressBar 提供了 setProgress 方法来设置进度条的当前进度。

1public void setProgress(int progress, boolean fromUser) {
2    if (progress != mProgress) {
3        mProgress = progress;
4        invalidate();  // 重新绘制进度条
5    }
6}

6. 设置最大值

setMax 方法用于设置进度条的最大值。

1public void setMax(int max) {
2    if (max != mMax) {
3        mMax = max;
4        invalidate();  // 重新绘制进度条
5    }
6}

7. 绘制进度条

ProgressBar 重写了 onDraw 方法来绘制进度条。

1@Override
2protected synchronized void onDraw(Canvas canvas) {
3    // ...
4    // 绘制进度条
5    if (mProgressDrawable != null) {
6        mProgressDrawable.draw(canvas);
7    }
8    // ...
9}

8. 绘制器

ProgressBar 使用 Drawable 对象来绘制进度条,其中 ProgressDrawableIndeterminateProgressDrawable 是两种不同的绘制器。

8.1 确定性绘制器 (ProgressDrawable)

确定性绘制器通常由一个背景和一个进度条组成。

1class ProgressDrawable extends LayerDrawable {
2    // ...
3    public ProgressDrawable(Context context, Callback callback, TypedArray a) {
4        // ...
5        // 设置背景层
6        addLayer(mBackground, null);
7        // 设置进度层
8        addLayer(mProgress, null);
9        // ...
10    }
11
12    @Override
13    public void draw(Canvas canvas) {
14        // ...
15        // 绘制背景
16        mBackground.setBounds(getBounds());
17        mBackground.draw(canvas);
18        // ...
19        // 计算进度条的位置
20        Rect bounds = getBounds();
21        int width = bounds.width();
22        int progressWidth = (int) ((float) width * (float) mProgress / (float) mMax);
23        // ...
24        // 绘制进度条
25        mProgress.setBounds(bounds.left, bounds.top, bounds.left + progressWidth, bounds.bottom);
26        mProgress.draw(canvas);
27        // ...
28    }
29}
8.2 不确定性绘制器 (IndeterminateProgressDrawable)

不确定性绘制器通常表现为动画效果。

1class IndeterminateProgressDrawable extends AnimationDrawable {
2    // ...
3    public IndeterminateProgressDrawable(Context context, Callback callback, TypedArray a) {
4        // ...
5        // 添加帧
6        addFrame(mFrames[0], mDuration);
7        addFrame(mFrames[1], mDuration);
8        addFrame(mFrames[2], mDuration);
9        // ...
10    }
11
12    @Override
13    public void draw(Canvas canvas) {
14        // ...
15        // 绘制当前帧
16        super.draw(canvas);
17        // ...
18    }
19}

9. 动画支持

ProgressBar 支持动画效果,特别是在不确定性模式下。

1public void startAnimation(Animation animation) {
2    // ...
3    if (animation != null) {
4        animation.setAnimationListener(mAnimationListener);
5        super.startAnimation(animation);
6    }
7    // ...
8}
9
10private Animation.AnimationListener mAnimationListener = new Animation.AnimationListener() {
11    @Override
12    public void onAnimationStart(Animation animation) {
13        // ...
14    }
15
16    @Override
17    public void onAnimationEnd(Animation animation) {
18        // ...
19    }
20
21    @Override
22    public void onAnimationRepeat(Animation animation) {
23        // ...
24    }
25};

10. 状态变化

ProgressBar 可以根据当前的状态来改变外观。

1@Override
2protected synchronized void drawableStateChanged() {
3    // ...
4    super.drawableStateChanged();
5    // ...
6    // 更新绘制器的状态
7    mIndeterminateProgressDrawable.setState(getDrawableState());
8    mProgressDrawable.setState(getDrawableState());
9    // ...
10}

总结

ProgressBar 的实现基于 View,并使用 Drawable 对象来绘制进度条。它支持确定性和不确定性两种模式,分别通过 ProgressDrawableIndeterminateProgressDrawable 来实现。通过设置进度和最大值,ProgressBar 可以动态地更新进度条的状态,并且支持动画效果。

http://www.yayakq.cn/news/349022/

相关文章:

  • cms进行网站开发seo站长查询
  • 莱芜区政协网站关于信用体系建设的网站
  • 网页开发网站理解电子商务网站建设与管理
  • 运城网站制作公司个人网站推荐免费
  • 成都网站设计策划免费网站中英文切换怎麼做
  • 电子商务网站建设可用性五个方面wordpress 去掉自豪
  • 最专业网站建网站怎么换域名
  • 怎么找网站做宣传江门免费模板建站
  • 网站建设使用的基本技术宝安公司网站建设
  • 磁力链网站怎么做的北京想象力网站建设
  • 为企业做网站还有前途吗开发商虚假宣传怎么赔偿
  • 什么网站可以做相册完整网站源码下载
  • 怎么查询网站是哪家公司做的上海市建筑装饰工程集团有限公司
  • 网站建设做网站需要多少钱?wordpress登录窗口
  • 西宁市建设局网站网站设计收费
  • 网站300m是什么意思东莞新感染一例阳性
  • 网站需求方案wordpress 翁
  • xss网站怎么搭建360广告联盟怎么做网站
  • 网络购物商城网站建设wordpress同步知乎插件
  • 密云网站建设宁波网站建设设计服务公司
  • 柳州公积金网站网站首页图片分辨率
  • 有口碑的合肥网站建设建设信用卡银行积分兑换商城网站
  • 政协网站 两学一做专题研讨wordpress调用自定义文章类型文章
  • seo优化网络公司排名温州seo优化排名公司
  • 如何用快站做pc端网站asp网站怎么做
  • 江门市住房建设管理局网站成都哪里做网站便宜
  • 成都网站建设 网络公司关于建设公司网站的建议
  • 主流网站建设吐鲁番做网站
  • 本地搭建linux服务器做网站天津滨海新区邮编
  • 重庆做网站的公司建设工程服务平台