Android 自带描边颜色渐变炫酷进度条

Android开发之绘制自定义进度条 | 渐变进度条 | 斜角进度条的方法 阅读详情

上图是我在PhotoShop中做出的进度条效果图,这张图充分阐释了本篇自定义进度条的精髓!

在Android中实现该进度条的原理:(和ps中作图原理一样,理解ps中的图层便懂得了如何在android中实现该进度条)

1. 画第一个圆角矩形作为进度条的最底层(描边层)

2. 画第二个圆角矩形作为进度条的第二层(背景层)盖在描边层之上

3. 画第三个圆角矩形作为进度条的最外层(进度层)盖在背景层之上

4. 描边层和背景层颜色可用纯色,进度层为了炫酷可用渐变色

这是实现该自带描边颜色渐变进度条的原理,也是在PS中实现该效果的步骤,同样适用于在Android中用代码来实现。

原理明白之后,代码就变得非常简单了:

public class ColorGradientProgressBar extends View {

    /**
     * 渐变颜色组
     */
    private int[] GRADIENT_COLORS = {Color.parseColor("#85D0E8"), Color.parseColor("#138CCF")};
    /**
     * 最大进度
     */
    private float max = 100;
    /**
     * 当前进度
     */
    private float progress;
    /**
     * 画笔
     */
    private Paint mPaint;
    /**
     * 外描边的宽度
     */
    private float BORDER_STROCK;
    /**
     * 进度条进度矩形与控件边界的距离,≥BORDER_STROCK
     */
    private float PROGRESS_STROCK;
    //进度条的宽高
    private int mWidth, mHeight;
    /**
     * 画进度条的矩形
     */
    private RectF mRectF;

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

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

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

    private void initView() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mRectF = new RectF();
        BORDER_STROCK = getResources().getDimension(R.dimen.x3);
        PROGRESS_STROCK = getResources().getDimension(R.dimen.x5);
    }

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

        int round = mHeight / 2;//弧度为高度的一半
        mRectF.set(0, 0, mWidth, mHeight);//第一层矩形(描边层)
        mPaint.setColor(Color.parseColor("#A3D8E8"));//第一层矩形颜色(进度条描边的颜色)
        canvas.drawRoundRect(mRectF, round, round, mPaint);//画第一层圆角矩形
        mPaint.setColor(Color.parseColor("#474C4E"));//第二层矩形颜色(背景层颜色)
        mRectF.set(BORDER_STROCK, BORDER_STROCK, mWidth - BORDER_STROCK, mHeight - BORDER_STROCK);//第二层矩形(背景层)
        canvas.drawRoundRect(mRectF, round, round, mPaint);//画背景层圆角矩形(盖在描边层之上)
        if (progress == 0)//进度为 0不画进度
            return;
        float section = progress / max;
        //第三层矩形(进度层)
        mRectF.set(PROGRESS_STROCK, PROGRESS_STROCK, (mWidth - PROGRESS_STROCK) * section, mHeight - PROGRESS_STROCK);
        //创建线性颜色渐变器
        LinearGradient shader = new LinearGradient(PROGRESS_STROCK, PROGRESS_STROCK,
                (mWidth - PROGRESS_STROCK) * section, mHeight - PROGRESS_STROCK, GRADIENT_COLORS, null, Shader.TileMode.MIRROR);
        mPaint.setShader(shader);//第三层矩形颜色(进度渐变色)
        canvas.drawRoundRect(mRectF, round, round, mPaint);//画第三层(进度层)圆角矩形(盖在背景层之上)
        mPaint.setShader(null);//清除之前传递的shader
    }

    /***
     * 设置最大进度
     *
     * @param maxCount
     */
    public void setMax(float maxCount) {
        this.max = maxCount;
    }

    /***
     * 设置当前进度
     *
     * @param currentCount
     */
    public void setProgress(float currentCount) {
        this.progress = currentCount > max ? max : currentCount;
        invalidate();
    }

    public float getMax() {
        return max;
    }


    /**
     * 测量得到进度条的宽高
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
        if (widthSpecMode == MeasureSpec.EXACTLY || widthSpecMode == MeasureSpec.AT_MOST) {
            mWidth = widthSpecSize;
        } else {
            mWidth = 0;
        }
        if (heightSpecMode == MeasureSpec.AT_MOST || heightSpecMode == MeasureSpec.UNSPECIFIED) {
            mHeight = (int) getResources().getDimension(R.dimen.x20);
        } else {
            mHeight = heightSpecSize;
        }
        setMeasuredDimension(mWidth, mHeight);
    }
}
代码很简单,注释也很清楚,效果如下:

代码中使用了dimens适配,详情请看Android 屏幕适配之dimens适配

Demo源码下载

Android 自带描边颜色渐变炫酷进度条(1) 2. 画第二个圆角矩形作为进度条的第二层(背景层)盖在描边层之上3. 画第三个圆角矩形作为进度条的最外层(进度层)盖在背景层之上4. 描边层和背景层颜色可用纯色,进度层为了炫酷可用渐变色这是实现该自带描边颜色渐变进度条的原理,也是在PS中实现该效果的步骤,同样适用于在Android中用代码来实现。原理明白之后,代码就变得非常简单了:/***//***//***//***//***//***///进度条的宽高/***/initView(); 阅读详情

相关推荐

Android 自带描边颜色渐变炫酷进度条,面试必知必会

3. 画第三个圆角矩形作为进度条的最外层(进度层)盖在背景层之上 4. 描边层和背景层颜色可用纯色,进度层为了炫酷可用渐变色 这是实现该自带描边颜色渐变进度条的原理,也是在PS中实现该效果的步骤,同样适用于在Android中用代码来实现。 原理明白之后,代码就变得非常简单了: public class ColorGradientProgressBar extends View { /** 渐变颜色组 */ private int[] GRADIENT_COLORS = {Color.parseColor

wa32saa的博客 1109

Android自定义View实现渐变色进度条

1. 渐变色,看起来颜色变化并不复杂,使用LinearGradient应该可以实现。 2. 圆头,无非是画两个圆,外圆使用渐变色的颜色,内圆固定为白色。 3. 灰底,还没有走到的进度部分为灰色。 4. 进度值,使用文本来显示; 5. 弧形的头部,考虑使用直线进行连接,或者使用曲线,例如贝塞尔曲线; 我首先初步实现了进度条的模样,发现样子有了,却不太美观。 反思了一下,我只是个写代码的,对于哪种比例比较美观,是没有清晰的认识的,所以,还是参考原图吧。

嘴巴吃糖了 1467

带颜色渐变效果的的矩形进度条

先看一下效果: 有没有亮瞎你的眼? 嗯...我说结尾的颜色。 先分析下实现的逻辑:我们用一个Drawable对象设置为button的背景;→Drawable对象我们取它的子类BitmapDrawable的一个实例,BitmapDrawAble需要一个Bitmap对象;→绘制这个bitmap:有一个外边的框框我们画一个矩形,进度那条线我们使用绘制一个Path来表现;→当前的进度

Wood的专栏 1910

android shape 渐变描边

【代码】android shape 渐变描边。

AdrianAndroid的专栏 2549

Android自定义圆弧进度条(半圆进度条) 圆弧渐变色进度条带指示 圆弧宽高可自由修改

Android 自定义圆弧进度条,支持设置为圆形进度条,弧度圆形渐变色,进度指示条,进度文字。

yeziyfx的专栏 8514

Android自定义View——从零开始实现圆形进度条

以前老是用别人造的轮子,知其然不知其所以然,有时看懂了别人写的过多几个月又忘了,遂来开个坑把一步步实现和思路写下来,弄成一个系列。本篇只要讲的是Android自定义圆形进度条

AnliaLee的博客 1万+

Android 简单实现自定义进度条

1.效果图 progress小于90的时候为绿色,大于90的时候变为红色。 2.步骤: <1>创建一个自定义view public class MyProgressBar extends View { private Paint mPaint = null ; private int max=100; private int progress=0;...

cx415462822的专栏 9472

android圆角矩形进度条

思路介绍 http://blog.youkuaiyun.com/li_xiao_kang/article/details/46225927

2024年Android最全Android 自带描边颜色渐变炫酷进度条,2024年最新面试必知必会

开发是需要一定的基础的,我是08年开始进入Android这行的,在这期间经历了Android的鼎盛时期,和所谓的Android”凉了“。中间当然也有着,不可说的心酸,看着身边朋友,同事一个个转前端,换行业,其实当时我的心也有过犹豫,但是我还是坚持下来了,这次的疫情就是一个好的机会,大浪淘沙,优胜劣汰。再等等,说不定下一个黄金浪潮就被你等到了。4. 描边层和背景层颜色可用纯色,进度层为了炫酷可用渐变色。

2301_79985012的博客 1312

PDN设计

作者:AirCity 2020.2.6 Aircity007@sina.com 本文所有权归作者Aircity所有 PDN设计的目的是降低电源纹波水平,减小电压跌落。我们通常要求LDO的文波水平是30mV,DCDC是50mV,超过这个就需要PDN设计。 PDN设计的方法是用不同的容值,合适的总电容量,降低电源平面与地平面之间的交流阻抗,确定容值总量和电容大小的过程,就是PDN设计过程。 为什么需...

AirCity123的博客 4146

视频教程-Ps教程之神奇的Photoshop自动化技术-Photoshop

Ps教程之神奇的Photoshop自动化技术 10年以上IT行业工作经验、三...

weixin_28812857的博客 1472

Android 自带描边颜色渐变炫酷进度条(1),android应用程序开发期末考试

//进度条的宽高 private int mWidth, mHeight; /** 画进度条的矩形 */ private RectF mRectF; public ColorGradientProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } public ColorGradientProgressBar(Context

wa2231a的博客 189

手把手教你为RK3588开发板适配RTL8211F网卡:设备树配置与PHY驱动匹配全流程

本文详细介绍了在RK3588开发板上适配RTL8211F千兆以太网PHY芯片的全流程,包括硬件原理图确认、设备树配置与PHY驱动匹配。通过实战案例和调试技巧,帮助开发者解决常见问题并优化网络性能,适用于嵌入式Linux开发中的Ethernet网络功能实现。

weixin_29184075的博客 525

小白也能搞定:用CSS3双半圆实现炫酷圆形进度条(附完整逻辑解

${ CSS 字符串 }

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 891

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

手把手教你使用ConvNeXt训练自己数据集和推理,ConvNeXt模型训练(CVPR 2022),一个能挑战 Vision Transformer 的卷积神经网络,含完整代码和数据集

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1448

二十一、CANdelaStudio深入-SPRMIB的配置

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的肯定响应抑制位配置,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YO CANdelaStudio-从入门到深入目录 文章目录CANdelaStu

诊断协议那些事儿's blog 1868

Android 描边颜色渐变进度条

public class ColorGradientProgressBar extends View {   /** * 渐变颜色组 */ private int[] GRADIENT_COLORS = {Color.parseColor("#85D0E8"), Color.parseColor("#138CCF")}; /** * 最大进度 */ private float...

Keepsty的博客 940

使用Matlab simulink的PLC coder功能进行算法搭建与处理

使用的案例如下: Anti-Windup PID Control Demonstration with Feedforward Control 将其中的PID块生成SCL语言再导入TIA 使用的平台如下: Matlab 2019b TIA portal 15.1 应用:可以在PLC中搭载一些并不方便使用的,或者比较难使用的算法 步骤如下: 首先打开案例,案例地址我放在最下面,点击Run运行仿真,必...

苦走一口田 1万+

改变Android ProgressBar样式颜色

先上两个效果图: (进度条是 自定义图片) (进度条是 自定义颜色) 一.修改背景为图片。 1.我自己制作了两张图片(如下图),并将它们放到工程的 /res/drawable 目录下。 (背景图片 prgs_bg.png) (进度图片 prgs_progress.png) 2.同时在 /res/drawable 目录下新建一个 barbgimg.xml 文件,内容如下

心无所属的专栏 1万+

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2294

PCL 基于超体素的点云分割【2024最新版】

点云超体素分割原理介绍、代码实现以及如何做到将每一个超体素内的点进行单独保存而不造成点云缺失的方法。博客长期更新,本文最近一次更新时间为:2024年12月29日。

点云侠的博客 36万+

Android进度条终极指南:MagicProgressWidget完全使用教程

想要为你的Android应用添加炫酷的进度动画效果吗?✨ MagicProgressWidget提供了渐变的圆形进度条和轻量横向进度条两种组件,让你的应用界面更加生动直观。无论你是新手还是经验丰富的开发者,这篇完整指南都将帮助你快速掌握这个强大的进度条库。 ## 🎯 什么是MagicProgressWidget? MagicProgressWidget是一个专为Android设计的进度条组件

gitblog_00027的博客 615

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android 進度條_Android 圆形进度条控件

自定义控件圆形进度条,支持顶部圆环渐变色,以及动画功能.效果图CircularProgressView_1.pngCircularProgressView_2.pngCircularProgressView_3.png使用方式android:layout_width="match_parent"android:layout_height="match_parent"android:padding=...

weixin_28452161的博客 100

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: Android 设置应用的底部导航栏(虚拟按键)背景颜色
下一篇: Android ijkplayer的使用解析及播放器的制作
github_2011
博客等级 码龄10年 116粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值