android 圆形进度View

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

这个圆形进度View是根据https://blog.youkuaiyun.com/qq_32519693/article/details/76726525

进行简单的修改成自己想要的效果的

效果图

 

1.arrts.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--圆弧进度条-->
    <declare-styleable name="CircleProgressValue">
        <attr name="strokeWidth" format="dimension"/>
        <attr name="circleColor" format="color"/>
        <attr name="ringColor" format="color"/>
        <attr name="ringBgColor" format="color"/>
        <attr name="circleText" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="totalProgress" format="integer"/>
    </declare-styleable>
</resources>

2.CircleProgressView.java

public class CircleProgressView extends View {
    // 画实心圆的画笔
    private Paint mCirclePaint;
    // 画圆环的画笔
    private Paint mRingPaint;
    // 画圆环的画笔背景色
    private Paint mRingPaintBg;
    // 画字体的画笔
    private TextPaint mTextPaint;
    // 圆形颜色
    private int mCircleColor;
    // 圆环颜色
    private int mRingColor;
    // 圆环背景颜色
    private int mRingBgColor;
    // 半径
    private float mRadius;
    // 圆环半径
    private float mRingRadius;
    // 圆环宽度
    private float mStrokeWidth;
    // 圆心x坐标
    private int mXCenter;
    // 圆心y坐标
    private int mYCenter;
    //园中心显示文字
    private String mCircleText;
    // 字的长度
    private int mTxtWidth;
    // 字的高度
    private int mTxtHeight;
    // 文字大小
    private float mTextSize;
    // 总进度
    private int mTotalProgress;
    // 当前进度
    private int mProgress;

    public CircleProgressView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 获取自定义的属性
        initAttrs(context, attrs);
        initVariable();
    }

    //属性
    private void initAttrs(Context context, AttributeSet attrs) {
        TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,
                R.styleable.CircleProgressValue, 0, 0);
        mStrokeWidth = typeArray.getDimension(R.styleable.CircleProgressValue_strokeWidth, 10);
        mCircleColor = typeArray.getColor(R.styleable.CircleProgressValue_circleColor, 0xFFFFFFFF);
        mRingColor = typeArray.getColor(R.styleable.CircleProgressValue_ringColor, 0xFFFFFFFF);
        mRingBgColor = typeArray.getColor(R.styleable.CircleProgressValue_ringBgColor, 0xFFFFFFFF);
        mTotalProgress=typeArray.getInt(R.styleable.CircleProgressValue_totalProgress,100);
        mTextSize = typeArray.getDimension(R.styleable.CircleProgressValue_textSize, mRadius/4);
        if (!TextUtils.isEmpty(typeArray.getString(R.styleable.CircleProgressValue_circleText))){
            mCircleText=typeArray.getString(R.styleable.CircleProgressValue_circleText);
        }

    }

    //初始化画笔
    private void initVariable() {
        //内圆
        mCirclePaint = new Paint();
        mCirclePaint.setAntiAlias(true);
        mCirclePaint.setColor(mCircleColor);
        mCirclePaint.setStyle(Paint.Style.FILL);

        //外圆弧背景
        mRingPaintBg = new Paint();
        mRingPaintBg.setAntiAlias(true);
        mRingPaintBg.setColor(mRingBgColor);
        mRingPaintBg.setStyle(Paint.Style.STROKE);
        mRingPaintBg.setStrokeWidth(mStrokeWidth);


        //外圆弧
        mRingPaint = new Paint();
        mRingPaint.setAntiAlias(true);
        mRingPaint.setColor(mRingColor);
        mRingPaint.setStyle(Paint.Style.STROKE);
        mRingPaint.setStrokeWidth(mStrokeWidth);
        //mRingPaint.setStrokeCap(Paint.Cap.ROUND);//设置线冒样式,有圆 有方

        //中间字
        mTextPaint = new TextPaint();
        mTextPaint.setAntiAlias(true);
        mTextPaint.setStyle(Paint.Style.FILL);
        mTextPaint.setColor(mRingColor);
        mTextPaint.setTextSize(mTextSize);

        Paint.FontMetrics fm = mTextPaint.getFontMetrics();
        mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);
    }

    //画图
    @Override
    protected void onDraw(Canvas canvas) {
        mXCenter = getWidth() / 2;
        mYCenter = getHeight() / 2;

        if (getWidth()>getHeight()){//如果宽>高,半径=高/2-边粗
            mRadius=mYCenter-mStrokeWidth;
        }else {
            mRadius=mXCenter-mStrokeWidth;
        }
        mRingRadius = mRadius + mStrokeWidth / 2;

        //内圆
        canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint);

        //外圆弧背景
        RectF oval1 = new RectF();
        oval1.left = (mXCenter - mRingRadius);
        oval1.top = (mYCenter - mRingRadius);
        oval1.right = mRingRadius * 2 + (mXCenter - mRingRadius);
        oval1.bottom = mRingRadius * 2 + (mYCenter - mRingRadius);
        canvas.drawArc(oval1, 0, 360, false, mRingPaintBg); //圆弧所在的椭圆对象、圆弧的起始角度、圆弧的角度、是否显示半径连线

        //外圆弧
        if (mProgress > 0 ) {
            RectF oval = new RectF();
            oval.left = (mXCenter - mRingRadius);
            oval.top = (mYCenter - mRingRadius);
            oval.right = mRingRadius * 2 + (mXCenter - mRingRadius);
            oval.bottom = mRingRadius * 2 + (mYCenter - mRingRadius);
            canvas.drawArc(oval, -90, ((float)mProgress / mTotalProgress) * 360, false, mRingPaint); //

            //字体
            if (!TextUtils.isEmpty(mCircleText)){
                //文字过长则换行
                StaticLayout textLayout = new StaticLayout(mCircleText,mTextPaint,mXCenter-mXCenter/4,
                        Layout.Alignment.ALIGN_CENTER, 1.0f, 0f,false);
                canvas.translate(mXCenter-mXCenter/2+mXCenter/8, mYCenter - mTxtHeight);
                textLayout.draw(canvas);
            }
        }
    }

    //设置进度
    public void setProgress(int progress) {
        mProgress = progress;
        postInvalidate();//重绘
    }

    public void setCircleText(String mCircleText) {
        this.mCircleText = mCircleText;
    }
}
Android自定义View-绘制扇形实现圆形进度 先上图,这是要实现的效果,根据音量的大小中间的进度调节。麦克风部分是透明的,所以原理就是在蒙层的底部画白色的扇形。如下图所示 这样就能实现圆形像水瓮一样的进度。 实现方法: 通过Canvas的drawArc方法实现。 public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, bo 阅读详情

相关推荐

Android 用自定义view画圆详解

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

路宇的博客 4617

Android自定义圆圈倒计时

怕原文失效留存,不错。

qwildwolf的博客 1170

Android自定义View进阶:创建带进度圆形进度条

自定义View是Android开发中不可或缺的高级技能,它赋予了开发者对界面的完全掌控,让我们可以创造出独特且符合特定需求的UI组件。要深入理解并熟练运用自定义View,不仅需要对Android绘图体系有清晰的认识,还要掌握自定义属性、事件处理、动画集成等关键点。本章将会带您走进Android自定义View的高级世界,帮助您从理论到实践,逐步构建出强大的自定义View组件。我们将从创建一个简单的自定义View开始,逐步深入了解并实现复杂的交互和动画效果。

weixin_31163455的博客 1125

Android 自定义View之圆形进度条

需求是不停的,会有这些需求:可指定画笔(宽度、颜色等)、可指定动画时长等。这些可以通过创建 Java 接口来设置,但我要学自定义View,就要用attr。未完待续~~Android Canvas的drawText()和文字居中方案。

weixin_44021334的博客 6224

实现圆形进度条:Android自定义View高级示例

自定义View是Android开发中提升用户界面丰富性的关键技术之一。从基础的概念到复杂的动画实现,自定义View都能有效地满足开发者的各种需求。想要成功创建一个自定义View,开发者必须遵循几个核心步骤。首先,必须了解Android的绘图系统,特别是Canvas和Paint类的使用。接着,需要掌握onMeasure和onDraw等方法来测量和绘制内容。此外,自定义View时还需要处理好布局参数的设置,确保View在各种布局环境下都能正确显示。

weixin_42514750的博客 942

Android自定义View:实现可拖动圆形进度条

自定义View是Android开发中一个非常重要的概念,它赋予了开发者强大的能力来创建独特且具有高度定制性的用户界面元素。通过继承已有的View类,开发者可以实现新的功能,并在应用中提供一致的用户体验。在自定义View的开发过程中,功能性扩展和自定义属性的设计是至关重要的。它们不仅提高了View的灵活性和可重用性,还增强了用户的体验。本章将深入探讨自定义属性的意义和实现方法,并展示如何扩展进度条的功能。

weixin_42581846的博客 813

android ProgressBar 实心圆

我整理的一些关于【CI】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1如何在 Android 中实现实心圆的 ProgressBar 在开发 Android 应用时,进度条(ProgressBar)是一种常用的 UI 组件,用于表示某项任务的进度。本文将指导您如...

weixin_35327824的博客 195

生物信息学新手必看:MAFFT多序列比对从安装到实战(附参数优化技巧)

本文为生物信息学新手提供了MAFFT多序列比对工具的完整指南。从Linux环境下的安装部署,到核心算法策略(如FFT-NS-i、L-INS-i)的选择逻辑,再到空位罚分等关键参数的深度解析与优化技巧,手把手教你完成从原始序列到高质量比对结果的实战流程,为后续进化树构建等分析奠定坚实基础。

weixin_29230773的博客 485

超简单的Android圆形进度条

效果图: 代码优化/简化、教科书级别注释、复制粘贴即可用 代码: package com.zistone.factorytest0718.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.gra

李小伟其实很菜 1万+

RLHF的数学表示

RLHF(Reinforcement Learning with Human Feedback)是一种结合了强化学习和人类反馈的机器学习方法。它通常用于训练智能体(agent)在复杂环境中做出决策,同时利用人类的反馈来指导和改进学习过程。RLHF 没有一个统一的数学表示式,因为它依赖于具体的应用场景和实现细节。然而,我们可以从强化学习和人类反馈的角度来描述RLHF的一些关键数学概念。

xw555666的博客 688

Zabbix7.0+DeepSeek大模型实现人工智能告警分析

本方案基于Zabbix7.0监控系统,通过底层webhook脚本机制集成Deepseek做故障分析提供解决方案,构建智能化运维体系。

xingdiango的博客 2372

Android:自定义View实现绚丽的圆形进度条

Android:自定义View实现绚丽的圆形进度条

books1958的专栏 8706

MOOS-ivp实战:从零搭建水下机器人通信系统(Ubuntu 22.04版)

本文详细介绍了在Ubuntu 22.04系统上从零开始搭建MOOS-ivp水下机器人通信系统的完整实战流程。内容涵盖环境准备、核心安装、MOOSDB通信模型解析、自定义应用节点开发、以及调试监控工具链的使用,旨在帮助开发者快速掌握这一分布式机器人系统框架,构建稳定可靠的水下机器人通信与控制系统。

snow3的博客 636

Android自定义View之圆形进度条

Android自定义View之圆形进度条尽管github上的开源圆形进度条已经很多了,但是我仍然希望能通过自己完成一个,接下来我就一步一步实现圆形进度条,今天我们要实现的效果图如下: 观察上面两幅图我们可以看到,这个图形是由两部分组成的中间的圆形+外围的弧形,我们自然而然的想到了用canvas画。想好就开始实践, 新建PercentDigitalView项目,新建view包,新建Perc

小海编码日记 676

SV--对象拷贝、参数化的类

对象拷贝,参数化的类

创芯人--fly的博客 1570

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

我是,今天我给大家分享一个关于RSA的题目,带大家领略的魅力。今天开始前,我们先学习一下。

m0_62102520的博客 853

android绘制环形进度_Android 自定义 View 之圆形进度条总结

原标题:Android 自定义 View 之圆形进度条总结最近撸了一个圆形进度条的开源项目,算是第一次完完整整的使用自定义 View 。在此对项目开发思路做个小结,欢迎大家 Star 和 Fork该项目总共实现了三种圆形进度条效果CircleProgress:圆形进度条,可以实现仿 QQ 健康计步器的效果,支持配置进度条背景色、宽度、起始角度,支持进度条渐变DialProgress:类似 Circ...

weixin_39888412的博客 418

【四旋翼】pixhawk2.4.8-地面站配置-APM固件-四旋翼从装机到试飞

因为MP版本和APM版本的适配问题,真的真的是很大一个坑。最好先走别人走过的路,走通了再去自由发挥,不然白白浪费时间。下面提供我试飞成功过的版本。下面提供任意版本固件和地面站的下载方法。

xifan的博客 3万+

Android 自定义View实现圆形加载进度条

Android 自定义view圆形加载进度条

Android_Gt 3477

Seurat-SCTransform与harmony整合学习

源于R tips:Seurat之SCTransform方法原理 (qq.com)Seurat对象在经过SCTransform处理后会增加一个SCT的Assay,里面的scaled.data就是经过scale之后的pearson residual值,这个值是用于后续降维聚类分析使用的。

hx2024的博客 2330

假人有限元模型

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

Android 自定义View——圆形进度

很多app在刚进入app时的欢迎页后的广告页右上角有一个点击跳过的按钮,印象中好像也见过圆形的点击跳过,还有圆形进度显示,准备在项目中也加入这个效果,于是自己花点时间写了个类似效果的自定义View,先来一发效果图: 这个View是个圆形,且有环形进度,中心有文字进度,所以我选择继承自原始View,原理就是根据时间的流逝,计算进度,重绘View。 主要分为4个部分: 自定义View属性

simonenfp 287

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android自定义view实现圆形进度条更新

Android自定义view实现圆形进度条更新准备期实现自定义ViewService主Activitylayout布局最终实现效果 刚回顾完群英传的自定义view章节,在3.6.3.1中弧形展示图,看完在想,做成加载进度条是否稍微有趣点呢,就着手开始实现了。先看下弧形展示图。 准备期 有了需求,那么就得先思考如何实现,开启线程,自加后更新数据?还是开个服务再返回更新呢?我选择后者,作为小白,多拓...

J1036767889的博客 484

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

安卓进阶之路:自定义View圆形进度条源码解析

安卓进阶之路:自定义View圆形进度条源码解析 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在Android开发中,自定义View是区分普通开发者与高手的重要技能之一。今天,我们介绍的开源项目——自定义View,自定义属性(带进度的圆形进度条)源码,是一个非常适合进阶学习的资源。该源码提供了一种新颖的进度展示方式,让应用界面更加直观和美观。 项目技术分析 项目基于A...

gitblog_06724的博客 270

Android自定义view实现圆形进度条

Android自定义view实现圆形进度条

吐尔洪江 2530

Android 自定义带数字的圆形进度条和中间是文字的圆形进度条View

这是一个自定义带数字的圆形进度条和中间是文字的圆形进度条View。自定义View的基本流程在这里就不多说了。(效果图在最后) 自定义View分好几种。我这个Demo主要用到了自己绘画的和组合的View。 首先看怎么自定义带数字的圆形进度条的View。注解读写在代码里了,在这里不多说。 类MyCirclePB自定义的View。具体代码如下: package com.yehu.z01_circ

WildTiger 4854

Android自定义View-圆形进度条

好几天不写博客了,这段时间一直没时间,感觉一直在忙,但是进度不大。 好了,言归正传,最近项目里要用到这么一个自定义view,是一个圆形的进度圆环,现在学习下怎么来自定义它。 源码下载地址https://github.com/baojie0327/ViewAndGroup自定义之前先分析一下,这个自定义View主要有以下几个部分组成: - 最外层的圆环 - 圆环上的小圆点,会随着进度移动 -

香蕉你个不呐呐的博客 582
上一篇: Android中MQTT的简单实现(只是连接到服务器,未实现发送、接受信息)
下一篇: Android 在java.class中使用gradle定义的变量&使用gradle替换manifest的${xx}
珊珊333333
博客等级 码龄17年 83粉丝 1375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值