Android自定义View之酷炫圆环(二)

我来为你详细讲解Android自定义View之酷炫圆环(二)的完整攻略。

1、前言

本文是 Android 自定义 View 系列的第二篇,主要讲解如何实现一个非常酷炫的圆环控件,使用者可以通过设置一些属性来自定义样式,比如说环的宽度、颜色、进度等。代码中会用到一些自定义属性以及一些 Canvas 的绘图技巧,用以实现一个非常酷炫的控件。

2、实现一个简单的圆环

首先,我们先来看如何在 Android 中绘制一个简单的圆环,代码如下:

public class SimpleCircleView extends View {
    private Paint mPaint;

    public SimpleCircleView(Context context) {
        this(context, null);
    }

    public SimpleCircleView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SimpleCircleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(10f);
        mPaint.setColor(Color.RED);
    }

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

        float radius = (Math.min(getWidth(), getHeight()) - getPaddingLeft() - getPaddingRight()) / 2;

        canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, mPaint);
    }
}

其中,我们在构造方法中初始化画笔,并设置它的一些属性,比如说画笔的样式、抗锯齿、宽度和颜色等。在 onDraw 方法中,则是通过 Canvas 绘制一个圆,圆的半径取决于 View 的宽高以及 Padding。

3、实现一个带进度的圆环

接下来,我们要实现的是一个带进度的圆环,具体思路如下:

  1. 通过自定义属性设置圆环的颜色、宽度、进度颜色等;
  2. 添加一个 setProgress 方法,当调用该方法时,我们就更新进度并重新绘制整个圆环。

下面是详细的实现代码:

public class ProgressCircleView extends View {
    private int mCircleColor;
    private int mCircleWidth;
    private int mProgressColor;
    private int mProgress;
    private boolean mShowProgressText;

    private Paint mCirclePaint;
    private Paint mProgressPaint;
    private Paint mTextPaint;

    public ProgressCircleView(Context context) {
        this(context, null);
    }

    public ProgressCircleView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ProgressCircleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ProgressCircleView);

        mCircleColor = a.getColor(R.styleable.ProgressCircleView_circleColor, Color.RED);
        mCircleWidth = a.getDimensionPixelSize(R.styleable.ProgressCircleView_circleWidth, 10);
        mProgressColor = a.getColor(R.styleable.ProgressCircleView_progressColor, Color.BLUE);
        mProgress = a.getInt(R.styleable.ProgressCircleView_progress, 0);
        mShowProgressText = a.getBoolean(R.styleable.ProgressCircleView_showProgressText, true);

        a.recycle();

        mCirclePaint = new Paint();
        mCirclePaint.setStyle(Paint.Style.STROKE);
        mCirclePaint.setAntiAlias(true);
        mCirclePaint.setStrokeWidth(mCircleWidth);
        mCirclePaint.setColor(mCircleColor);

        mProgressPaint = new Paint();
        mProgressPaint.setStyle(Paint.Style.STROKE);
        mProgressPaint.setAntiAlias(true);
        mProgressPaint.setStrokeWidth(mCircleWidth);
        mProgressPaint.setColor(mProgressColor);

        mTextPaint = new Paint();
        mTextPaint.setStyle(Paint.Style.FILL);
        mTextPaint.setAntiAlias(true);
        mTextPaint.setColor(mProgressColor);
        mTextPaint.setTextSize(30f);
    }

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

        float radius = (Math.min(getWidth(), getHeight()) - getPaddingLeft() - getPaddingRight()) / 2;

        canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, mCirclePaint);

        RectF oval = new RectF(getWidth() / 2 - radius, getHeight() / 2 - radius, getWidth() / 2 + radius, getHeight() / 2 + radius);

        canvas.drawArc(oval, -90, 360 * mProgress / 100, false, mProgressPaint);

        if (mShowProgressText) {
            String progressText = mProgress + "%";
            Rect bounds = new Rect();
            mTextPaint.getTextBounds(progressText, 0, progressText.length(), bounds);
            float x = getWidth() / 2 - bounds.width() / 2;
            float y = getHeight() / 2 + bounds.height() / 2;
            canvas.drawText(progressText, x, y, mTextPaint);
        }
    }

    public void setProgress(int progress) {
        if (progress < 0 || progress > 100) {
            throw new IllegalArgumentException("progress must be between 0 and 100");
        }

        mProgress = progress;
        invalidate();
    }
}

在自定义 View 的构造方法中,我们获取自定义属性的值,并初始化画笔。在 onDraw 方法中,我们首先绘制一个圆环,然后根据进度画出圆弧,最后如果需要显示进度文字,则画出进度文字。在 setProgress 方法中,我们会对传进来的进度值进行合法性检查,然后更新进度,并调用 invalidate() 方法来重绘整个圆环。

4、总结

至此,我们已经完成了一个非常炫酷的圆环控件,并讲解了在 Android 中自定义 View 的相关技巧。希望这篇文章能给你带来一些帮助,如果你还想要了解更多关于 Android 自定义 View 的内容,可以继续关注我的博客,在博客中我会持续更新相关的文章。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android自定义View之酷炫圆环(二) - Python技术站

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

相关文章

  • notepad++:正则表达式系统教程

    以下是详细讲解“notepad++:正则表达式系统教程的完整攻略”的标准Markdown格式文本,包含两个示例说明: Notepad++:正则表达式系统程的完整攻略 Notepad++是一款免费的文本编辑器,支持正则表达式搜索和替换。本攻略将介绍Notepad++中正则表达式的基本语法、常用元字符和示例说明等内容。 基本语法 Notepad++中正则表达式的…

    other 2023年5月10日
    00
  • weblogic服务器的简单使用(一)

    WebLogic服务器的简单使用(一) WebLogic是一款Java应用服务器,可以用于部署和运行Java应用程序。本文将介绍如何使用WebLogic服务器,包括安装WebLogic服务器、创建域、部署应用程序等。 安装WebLogic服务器 在使用WebLogic服务器之前,需要先安装WebLogic服务器。可以从Oracle官网(https://www…

    other 2023年5月5日
    00
  • python 自定义装饰器实例详解

    Python自定义装饰器实例详解 什么是装饰器 装饰器是Python语法中的一种高级函数,它可以让已有函数或类的属性发生改变,而不修改原本函数或类的定义。 装饰器的语法 def decorator(func): # 在这里对被装饰函数进行处理,或者添加新的功能 return func 使用装饰器的场景 装饰器主要用于在不修改原有代码的情况下,给函数附加额外的…

    other 2023年6月25日
    00
  • spring IOC控制反转原理详解

    Spring IOC控制反转原理详解 什么是IOC? IOC(Inversion Of Control,即“控制反转”)是一种设计思想,它最早应用于框架的设计。它的基本思想是:将你设计好的对象交给容器,就是有了“控制权的转移”,由容器去帮你创建和管理这些对象。 通常是在框架或类库中使用IOC。在这种情况下,框架或类库决定什么时候实例化何种类,并且负责为类的属…

    other 2023年6月27日
    00
  • Docker Overlay2磁盘空间占用过大清理的方法实现

    Docker Overlay2磁盘空间占用过大清理的方法实现 Docker Overlay2是Docker引擎默认的存储驱动程序之一,它在使用过程中可能会导致磁盘空间占用过大的问题。本攻略将详细介绍如何清理Docker Overlay2磁盘空间,以减少磁盘占用。 步骤一:查看磁盘空间占用情况 在执行清理操作之前,我们首先需要查看当前Docker Overla…

    other 2023年8月2日
    00
  • 没有竞品 紫光展锐推出超强算力AIoT解决方案 V5663

    紫光展锐推出超强算力AIoT解决方案 V5663 最近,紫光展锐推出了一款超强算力AIoT解决方案 V5663,不仅拥有高性能、高效率的特点,而且具备可塑性强、广泛适用的特点。以下是详细的攻略,希望对您有所帮助。 什么是V5663? V5663是紫光展锐推出的一款集成了高性能CPU、GPU和AI加速器的AIoT解决方案,可以用于物联网、智能制造、智能家居等多…

    other 2023年6月26日
    00
  • golang快速入门:从菜鸟变大佬

    Golang快速入门:从菜鸟变大佬 简介 Go是一种开源的编程语言,由Google开发。它具有高效、简洁、安全等特点,适用于构建高性能的网络服务和分布式系统。本攻略将介绍如何快速入门Go语言,从菜鸟变成大佬。 安装和配置 可以从官方网站下载Go语言的安装包,并按照提示进行安装。安装完成后,需要配置环境变量,以便在命令行中使用Go命令。可以在.bashrc或.…

    other 2023年5月7日
    00
  • 详解Go语言变量作用域

    详解Go语言变量作用域 在Go语言中,变量的作用域决定了它在程序中的可见性和可访问性。变量的作用域可以分为全局作用域和局部作用域。本攻略将详细讲解Go语言变量作用域的概念和规则,并提供两个示例来说明。 全局作用域 全局作用域是指在整个程序中都可以访问的变量。在Go语言中,全局变量声明在函数体外部,可以在任何函数中使用。 示例1: package main i…

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