Android自定义进度条实现步骤

一、了解自定义进度条

Android提供了ProgressBar控件,可以用于显示进度条,在进行长时间操作或加载资源时,可以通过进度条让用户感知到操作的进展。但是ProgressBar本身的样式有限,不能满足特殊的设计需求,此时可以考虑自定义进度条。

自定义进度条可以灵活控制进度的样式、颜色、大小等,同时也可以进行动态的渲染和交互。自定义进度条一般使用Canvas和Paint来绘制进度效果,通过实现自定义View或继承ProgressBar来实现。

二、自定义View实现进度条

1、新建一个自定义View,继承View类,并实现onDraw()方法。onDraw()方法是用来绘制自定义View的主要方法。这里我们使用Canvas和Paint来进行绘制,绘制的内容是一个矩形,矩形的长度和宽度都是根据当前进度值来计算得出。

public class CustomProgressBar extends View {

    private Paint mPaint;
    private RectF mRectF;
    private int mProgressBarColor;
    private int mProgressBarHeight;
    private int mMaxValue;
    private int mCurrentValue;

    public CustomProgressBar(Context context) {
        super(context);
        initView();
    }

    public CustomProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
        parseAttrs(attrs);
    }

    public CustomProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
        parseAttrs(attrs);
    }

    private void initView() {
        mProgressBarColor = Color.BLUE;
        mProgressBarHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());
        mMaxValue = 100;
        mCurrentValue = 0;

        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);

        mRectF = new RectF();
    }

    private void parseAttrs(AttributeSet attrs) {
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.CustomProgressBar);
        mProgressBarColor = typedArray.getColor(R.styleable.CustomProgressBar_progressBarColor, Color.BLUE);
        mProgressBarHeight = typedArray.getDimensionPixelSize(R.styleable.CustomProgressBar_progressBarHeight, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()));
        mMaxValue = typedArray.getInt(R.styleable.CustomProgressBar_maxValue, 100);
        mCurrentValue = typedArray.getInt(R.styleable.CustomProgressBar_currentValue, 0);
        typedArray.recycle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setColor(mProgressBarColor);
        mRectF.set(0, 0, getWidth() * mCurrentValue / mMaxValue, mProgressBarHeight);
        canvas.drawRect(mRectF, mPaint);
    }

    public void setMaxValue(int maxValue) {
        this.mMaxValue = maxValue;
    }

    public void setCurrentValue(int currentValue) {
        this.mCurrentValue = currentValue;
        invalidate();
    }
}

2、在attrs.xml文件中定义自定义属性,这些属性将用于在XML布局文件中设置进度条的样式和属性。


    
        
        
        
        
    

3、在XML布局文件中使用自定义进度条。


4、在Activity中设置自定义进度条的最大值和当前值,调用setCurrentValue()方法更新进度条的进度。

CustomProgressBar progressBar = findViewById(R.id.progress_bar);
progressBar.setMaxValue(100);
progressBar.setCurrentValue(50);

三、继承ProgressBar实现进度条

1、新建一个自定义ProgressBar,继承ProgressBar类,重写onDraw()方法。onDraw()方法是用来绘制进度条的主要方法。这里我们使用Canvas和Paint来进行绘制,绘制的内容是一个矩形。

public class CustomProgressBar extends ProgressBar {

    private Paint mPaint;
    private RectF mRectF;
    private int mProgressBarColor;
    private int mProgressBarHeight;

    public CustomProgressBar(Context context) {
        super(context);
        initView();
    }

    public CustomProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
        parseAttrs(attrs);
    }

    public CustomProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
        parseAttrs(attrs);
    }

    private void initView() {
        mProgressBarColor = Color.BLUE;
        mProgressBarHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics());

        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);

        mRectF = new RectF();
    }

    private void parseAttrs(AttributeSet attrs) {
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.CustomProgressBar);
        mProgressBarColor = typedArray.getColor(R.styleable.CustomProgressBar_progressBarColor, Color.BLUE);
        mProgressBarHeight = typedArray.getDimensionPixelSize(R.styleable.CustomProgressBar_progressBarHeight, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics()));
        typedArray.recycle();
    }

    @Override
    protected synchronized void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setColor(mProgressBarColor);
        mRectF.set(getPaddingLeft(), getHeight() - mProgressBarHeight - getPaddingBottom(),
                getWidth() * getProgress() / getMax() - getPaddingRight(),
                getHeight() - getPaddingBottom());
        canvas.drawRect(mRectF, mPaint);
    }
}

2、在attrs.xml文件中定义自定义属性,这些属性将用于在XML布局文件中设置进度条的样式和属性。


    
        
        
    

3、在XML布局文件中使用自定义进度条。


4、在Activity中设置自定义进度条的最大值和当前值,调用setProgress()方法更新进度条的进度。

CustomProgressBar progressBar = findViewById(R.id.progress_bar);
progressBar.setMax(100);
progressBar.setProgress(50);

综上所述,通过自定义View或继承ProgressBar可以实现自定义进度条,可以根据需求来选择实现方式,并进行样式和属性的自定义。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/252088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-13 17:34
下一篇 2024-12-13 17:34

相关推荐

  • Python初学者指南:第一个Python程序安装步骤

    在本篇指南中,我们将通过以下方式来详细讲解第一个Python程序安装步骤: Python的安装和环境配置 在命令行中编写和运行第一个Python程序 使用IDE编写和运行第一个Py…

    编程 2025-04-29
  • Python中自定义函数必须有return语句

    自定义函数是Python中最常见、最基本也是最重要的语句之一。在Python中,自定义函数必须有明确的返回值,即必须要有return语句。本篇文章将从以下几个方面对此进行详细阐述。…

    编程 2025-04-29
  • 正五边形画法步骤图解

    正五边形是一种经典的几何图形,其独特的构造方式给它带来了无限的美感和艺术价值。本篇文章将从多个方面详细阐述正五边形的画法步骤图解,帮助您轻松get到绘制正五边形的窍门。 一、构造正…

    编程 2025-04-29
  • 使用Python图书馆抢座脚本的完整步骤

    本文将从多个方面详细介绍如何使用Python编写图书馆的座位抢占脚本,并帮助您快速了解如何自动抢占图书馆的座位,并实现您的学习计划。 一、开发环境搭建 首先,我们需要安装Pytho…

    编程 2025-04-28
  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Python自定义列表

    本文将为大家介绍Python中自定义列表的方法和应用场景。对自定义列表进行详细的阐述,包括列表的基本操作、切片、列表推导式、列表的嵌套以及列表的排序,希望能够帮助大家更好地理解和应…

    编程 2025-04-27
  • 如何添加Python自定义模块?

    Python是一种非常流行的脚本语言,因其易学易用和功能强大而备受欢迎。自定义模块是Python开发中经常使用的功能之一。本文将从多个方面为您介绍如何添加Python自定义模块。 …

    编程 2025-04-27
  • Android Studio HUD 实现指南

    本文将会以实例来详细阐述如何在 Android Studio 中使用 HUD 功能实现菊花等待指示器的效果。 一、引入依赖库 首先,我们需要在 build.gradle 文件中引入…

    编程 2025-04-27
  • Android和Vue3混合开发方案

    本文将介绍如何将Android和Vue3结合起来进行混合开发,以及其中的优势和注意事项。 一、环境搭建 在进行混合开发之前,需要搭建好相应的开发环境。首先需要安装 Android …

    编程 2025-04-27

发表回复

登录后才能评论