android自定义view制作圆形进度条效果

yizhihongxing

下面我将为你详细讲解Android自定义View制作圆形进度条效果的完整攻略。

一、前置知识

在学习制作圆形进度条之前,我们需要掌握以下一些知识:

  • Android自定义View的基本原理
  • 画笔(Paint)的使用
  • Canvas的使用

如果你对这些知识还不是很熟悉,可以查看相关的资料和学习。

二、绘制圆形进度条的原理

实现圆形进度条的关键在于理解角度的概念,以及如何绘制弧形和圆弧。

在绘制圆形进度条的过程中,我们需要分别绘制圆弧的背景和进度。

具体步骤如下:

  1. 首先,我们需要定义一个Paint对象来绘制圆弧。下面是一个绘制圆弧的示例代码:
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(10);
  1. 接下来,我们需要根据进度值计算出圆弧的起始角度和扫描角度。假设进度范围为0~100,那么圆弧的起始角度为-90度,扫描角度为当前进度值所对应的角度。
float startAngle = -90;
float sweepAngle = progress * 360 / 100;
  1. 绘制圆弧背景。通过调用Canvas的drawArc()方法来绘制一个圆弧,具体如下:
canvas.drawArc(rectF, startAngle, sweepAngle, false, paint);

其中,rectF表示我们要绘制圆弧的矩形区域,false表示绘制的是圆弧而非扇形。

  1. 绘制进度圆弧。这个步骤和上面的步骤非常类似,只需要将Paint对象的颜色改为显示进度的颜色即可。

通过上面的步骤,我们就能完成绘制一个简单的圆形进度条了。

三、制作圆形进度条的示例代码

下面是一个制作圆形进度条的示例代码,供你参考:

public class CircleProgressBar extends View {

    private Paint mBgPaint;
    private Paint mProgressPaint;

    private float mProgress;   // 进度值,取值范围[0,100]

    public CircleProgressBar(Context context) {
        super(context);
        init();
    }

    public CircleProgressBar(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CircleProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mBgPaint = new Paint();
        mBgPaint.setColor(Color.GRAY);
        mBgPaint.setStyle(Paint.Style.STROKE);
        mBgPaint.setStrokeWidth(dp2px(5));

        mProgressPaint = new Paint();
        mProgressPaint.setColor(Color.RED);
        mProgressPaint.setStyle(Paint.Style.STROKE);
        mProgressPaint.setStrokeWidth(dp2px(5));
    }

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

        int width = getWidth();
        int height = getHeight();
        float cx = width / 2f;
        float cy = height / 2f;

        float radius = Math.min(width, height) / 2f - dp2px(5);  // 半径

        RectF rectF = new RectF(cx - radius, cy - radius, cx + radius, cy + radius);

        float startAngle = -90;
        float sweepAngle = mProgress * 360 / 100;

        canvas.drawArc(rectF, startAngle, 360, false, mBgPaint);   // 绘制背景圆弧
        canvas.drawArc(rectF, startAngle, sweepAngle, false, mProgressPaint);  // 绘制进度圆弧
    }

    /**
     * 设置进度值
     * @param progress 进度值,取值范围[0,100]
     */
    public void setProgress(float progress) {
        if (progress > 100) {
            progress = 100;
        } else if (progress < 0) {
            progress = 0;
        }

        mProgress = progress;
        invalidate();
    }

    /**
     * dp转换为px
     * @param dpValue dp值
     * @return px值
     */
    private float dp2px(float dpValue) {
        float density = getResources().getDisplayMetrics().density;
        return dpValue * density + 0.5f;
    }
}

上面这个示例代码中,实现了一个简单的圆形进度条。通过调用setProgress()方法设置进度值,圆形进度条会自动根据进度值绘制出相应的进度圆弧。

四、制作自定义颜色圆形进度条的示例

上面的示例代码是一个简单的圆形进度条,但是颜色比较单调。我们也可以给圆形进度条增加一个自定义的渐变色背景。

下面是一个实现自定义颜色圆形进度条的示例代码:

public class CustomProgressBar extends View {

    private Paint mBgPaint;
    private Paint mProgressPaint;

    private float mProgress;   // 进度值,取值范围[0,100]

    private int[] mBgColors = new int[]{Color.parseColor("#008080"), Color.parseColor("#7CFC00")};  // 圆形进度条背景颜色数组
    private int[] mProgressColors = new int[]{Color.parseColor("#FF6347"), Color.parseColor("#FFD700")}; // 圆形进度条进度颜色数组

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

    public CustomProgressBar(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mBgPaint = new Paint();
        mBgPaint.setStyle(Paint.Style.STROKE);
        mBgPaint.setStrokeWidth(dp2px(5));

        mProgressPaint = new Paint();
        mProgressPaint.setStyle(Paint.Style.STROKE);
        mProgressPaint.setStrokeWidth(dp2px(5));
    }

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

        int width = getWidth();
        int height = getHeight();
        float cx = width / 2f;
        float cy = height / 2f;

        float radius = Math.min(width, height) / 2f - dp2px(5);  // 半径

        // 绘制圆形进度条背景渐变色
        SweepGradient bgSweepGradient = new SweepGradient(
                cx, cy,
                mBgColors,
                null
        );
        mBgPaint.setShader(bgSweepGradient);

        RectF bgRectF = new RectF(cx - radius, cy - radius, cx + radius, cy + radius);
        canvas.drawArc(bgRectF, 0, 360, false, mBgPaint);

        // 绘制进度圆弧
        SweepGradient progressSweepGradient = new SweepGradient(
                cx, cy,
                mProgressColors,
                null
        );
        mProgressPaint.setShader(progressSweepGradient);

        float startAngle = -90;
        float sweepAngle = mProgress * 360 / 100;

        RectF progressRectF = new RectF(cx - radius, cy - radius, cx + radius, cy + radius);
        canvas.drawArc(progressRectF, startAngle, sweepAngle, false, mProgressPaint);
    }

    /**
     * 设置进度值
     * @param progress 进度值,取值范围[0,100]
     */
    public void setProgress(float progress) {
        if (progress > 100) {
            progress = 100;
        } else if (progress < 0) {
            progress = 0;
        }

        mProgress = progress;
        invalidate();
    }

    /**
     * dp转换为px
     * @param dpValue dp值
     * @return px值
     */
    private float dp2px(float dpValue) {
        float density = getResources().getDisplayMetrics().density;
        return dpValue * density + 0.5f;
    }
}

上面这个示例代码中,使用SweepGradient类来绘制圆弧的渐变背景色和进度色。同时,也提供了setProgress()方法来设置进度值。

综上所述,这就是Android自定义View制作圆形进度条效果的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:android自定义view制作圆形进度条效果 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 域名必备知识 域名名词解释大全

    域名必备知识 域名名词解释大全 1. 域名解析(Domain Name Resolution) 域名解析是将域名转换为IP地址的过程。当用户在浏览器中输入一个域名时,浏览器会向域名解析服务器发送请求,解析服务器会返回与该域名对应的IP地址,然后浏览器才能通过IP地址找到对应的网站。 示例说明: 假设用户在浏览器中输入了域名\”www.example.com\…

    other 2023年8月5日
    00
  • 剖析Windows用1G内存还慢的原因

    剖析Windows用1G内存还慢的原因 1. 内存不足 Windows操作系统对于正常运行需要一定的内存资源。如果系统只有1G内存,可能会导致内存不足,从而影响系统的性能。以下是两个示例说明: 示例1:多任务运行 当系统只有1G内存时,如果同时打开多个应用程序或者运行多个任务,系统会不得不频繁地进行内存交换(将内存中的数据写入硬盘,然后再读取其他数据到内存)…

    other 2023年8月1日
    00
  • shell实现同时操作多个服务器:服务器批量管理

    Shell实现同时操作多个服务器: 服务器批量管理 简介 服务器的数量随着公司的发展和业务的扩大日渐增多,对于运维人员而言,服务器的管理和维护是一个重要的任务,而批量管理服务器是大大减少管理时间和提高工作效率的一个好方法。本文介绍如何使用Shell脚本实现同时操作多个服务器的批量管理。 环境准备 在使用Shell脚本批量管理服务器之前,需要确保目标服务器与操…

    其他 2023年3月28日
    00
  • 浏览器清理Internet选项管理加载项时发现打不开怎么办?

    浏览器清理Internet选项管理加载项时发现打不开怎么办? 当我们在浏览器中清理Internet选项管理加载项时,有时候可能会遇到无法打开选项的情况。这种情况可能是由于浏览器插件或者其他因素造成的。接下来我们将为大家提供一些针对此问题的解决方案: 解决方案一:使用浏览器的安全模式 安全模式可以帮助我们在没有插件或扩展程序的情况下启动浏览器。这有助于我们确定…

    other 2023年6月25日
    00
  • Linux内核设备驱动之内核的时间管理笔记整理

    简介 Linux内核设备驱动之内核的时间管理笔记详细讲解了Linux内核中的时间管理机制和相关API函数,涵盖了时钟、定时器、闹钟、计时器等多个方面的知识,并提供了丰富的示例代码进行演示和实践。此篇笔记适合对Linux内核具有一定基础知识的读者阅读。 攻略 (1) 了解内核时间管理机制 在这部分,了解内核时间管理机制是关键,包括系统时间的获取与设置、硬件时钟…

    other 2023年6月27日
    00
  • Android ScrollView嵌套横向滑动控件时冲突问题

    Android ScrollView嵌套横向滑动控件时冲突问题攻略 在Android开发中,当我们需要在ScrollView中嵌套横向滑动的控件时,可能会遇到滑动冲突的问题。这是因为ScrollView默认会拦截所有的滑动事件,导致横向滑动控件无法正常工作。下面是解决这个问题的完整攻略。 1. 使用HorizontalScrollView替代ScrollVi…

    other 2023年7月28日
    00
  • softlockup解决思路

    以下是关于“softlockup解决思路”的完整攻略,包含两个示例。 softlockup解决思路 softlockup是Linux内核中的一种死锁情况,通常是由内核线程长时间占用CPU资源而导致的。以下是关于如何解决softlockup的详细攻略。 1. 升级内核 softlockup通常是由于内核中的某些bug导致的。因此,升级内核是解决softlock…

    other 2023年5月9日
    00
  • Mysql 忘记root密码的完美解决方法

    Mysql 忘记root密码的完美解决方法 如果您忘记了 Mysql 的 root 用户密码怎么办?本文将介绍一种解决方法。 方法 步骤一:停止 Mysql 服务 在开始重置密码之前,首先需要停止 Mysql 服务。可以输入以下命令以停止 Mysql 服务: sudo systemctl stop mysql 步骤二:编辑 Mysql 配置文件 编辑 Mys…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部