Android中怎么自定义view实现圆环进度条效果
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,这篇文章主要讲解了"Android中怎么自定义view实现圆环进度条效果",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android中怎么自定义vie
千家信息网最后更新 2025年11月10日Android中怎么自定义view实现圆环进度条效果
这篇文章主要讲解了"Android中怎么自定义view实现圆环进度条效果",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android中怎么自定义view实现圆环进度条效果"吧!
核心代码
自定义view的属性
自定义view
package com.czhappy.ringprogressdemo.view;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Typeface;import android.util.AttributeSet;import android.util.Log;import android.view.View;import com.czhappy.ringprogressdemo.R;/** * Description: * User: chenzheng * Date: 2017/2/10 0010 * Time: 15:11 */public class RingProgressBar extends View { /** * 画笔对象的引用 */ private Paint ringPaint; private Paint ringProgressPaint; private Paint txtPaint; /** * 圆环的颜色 */ private int ringColor; /** * 圆环进度的颜色 */ private int ringProgressColor; /** * 中间进度百分比的字符串的颜色 */ private int textColor; /** * 中间进度百分比的字符串的字体 */ private float textSize; /** * 圆环的宽度 */ private float ringWidth; /** * 最大进度 */ private int max; /** * 当前进度 */ private int progress; /** * 是否显示中间的进度 */ private boolean textIsDisplayable; private Context mContext; /** * 进度的风格,实心或者空心 */ private int style; public static final int STROKE = 0; public static final int FILL = 1; public RingProgressBar(Context context) { this(context, null); } public RingProgressBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RingProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = context; // 获取自定义的属性 initAttrs(context, attrs); initPaint(); } private void initAttrs(Context context, AttributeSet attrs) { TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RingProgressBar); //获取自定义属性和默认值 ringColor = mTypedArray.getColor(R.styleable.RingProgressBar_ringColor, Color.GRAY); ringProgressColor = mTypedArray.getColor(R.styleable.RingProgressBar_ringProgressColor, Color.GREEN); textColor = mTypedArray.getColor(R.styleable.RingProgressBar_textColor, Color.GREEN); textSize = mTypedArray.getDimension(R.styleable.RingProgressBar_textSize, 16); ringWidth = mTypedArray.getDimension(R.styleable.RingProgressBar_ringWidth, 5); max = mTypedArray.getInteger(R.styleable.RingProgressBar_max, 100); textIsDisplayable = mTypedArray.getBoolean(R.styleable.RingProgressBar_textIsDisplayable, true); style = mTypedArray.getInt(R.styleable.RingProgressBar_style, 0); //资源回收 mTypedArray.recycle(); } /** * 初始化画笔 */ private void initPaint() { //圆环画笔 ringPaint = new Paint(); ringPaint.setColor(ringColor); //设置圆环的颜色 ringPaint.setStyle(Paint.Style.STROKE); //设置空心 ringPaint.setStrokeWidth(ringWidth); //设置圆环的宽度 ringPaint.setAntiAlias(true); //消除锯齿 //圆环进度画笔 ringProgressPaint = new Paint(); ringProgressPaint.setColor(ringProgressColor); //设置圆环的颜色 ringProgressPaint.setStrokeWidth(ringWidth); //设置圆环的宽度 ringProgressPaint.setAntiAlias(true); //消除锯齿 switch (style) { case STROKE: ringProgressPaint.setStyle(Paint.Style.STROKE); break; case FILL: ringProgressPaint.setStyle(Paint.Style.FILL_AND_STROKE); break; } //百分比文字画笔 txtPaint = new Paint(); txtPaint.setColor(textColor); txtPaint.setTextSize(textSize); txtPaint.setTypeface(Typeface.DEFAULT_BOLD); //设置字体 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //圆心坐标 int mXCenter = getWidth() / 2; int mYCenter = getHeight() / 2; int radius = (int) (mXCenter - ringWidth / 2); //圆环的半径 //绘制圆环 canvas.drawCircle(mXCenter, mYCenter, radius, ringPaint); //绘制圆环进度 RectF oval = new RectF(mXCenter - radius, mYCenter - radius, mXCenter + radius, mYCenter + radius); //用于定义的圆弧的形状和大小的界限 switch (style) { case STROKE: canvas.drawArc(oval, -90, 360 * progress / max, false, ringProgressPaint); //根据进度画圆弧 break; case FILL: if (progress != 0) canvas.drawArc(oval, -90, 360 * progress / max, true, ringProgressPaint); //根据进度画圆弧 break; } //绘制百分比数字 //文字绘制 String txt = progress + "%"; //文字的长度 float mTxtWidth = txtPaint.measureText(txt, 0, txt.length()); Log.e("tag", textIsDisplayable+","+progress+(style==STROKE)); if(textIsDisplayable && progress!=0 && style==STROKE){ canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter+textSize/2, txtPaint); } } public synchronized int getMax() { return max; } /** * 设置进度的最大值 * @param max */ public synchronized void setMax(int max) { if(max < 0){ throw new IllegalArgumentException("max not less than 0"); } this.max = max; } /** * 获取进度.需要同步 * @return */ public synchronized int getProgress() { return progress; } /** * 设置进度,此为线程安全控件,由于考虑多线程的问题,需要同步 * 刷新界面调用postInvalidate()能在非UI线程刷新 * @param progress */ public synchronized void setProgress(int progress) { if(progress < 0){ throw new IllegalArgumentException("progress not less than 0"); } if(progress > max){ progress = max; } if(progress <= max){ this.progress = progress; postInvalidate(); } } public int getRingColor() { return ringColor; } public void setRingColor(int ringColor) { this.ringColor = ringColor; } public int getRingProgressColor() { return ringProgressColor; } public void setRingProgressColor(int ringProgressColor) { this.ringProgressColor = ringProgressColor; } public int getTextColor() { return textColor; } public void setTextColor(int textColor) { this.textColor = textColor; } public float getTextSize() { return textSize; } public void setTextSize(float textSize) { this.textSize = textSize; } public float getRingWidth() { return ringWidth; } public void setRingWidth(float roundWidth) { this.ringWidth = roundWidth; }}MainActivity.java
package com.czhappy.ringprogressdemo.activity;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import com.czhappy.ringprogressdemo.R;import com.czhappy.ringprogressdemo.view.RingProgressBar;public class MainActivity extends AppCompatActivity { private RingProgressBar myProgress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myProgress = (RingProgressBar) findViewById(R.id.myProgress); } public void beginAnim(View view){ new Thread(){ @Override public void run() { super.run(); for(int i=0; i<=60; i++){ try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } myProgress.setProgress(i); } } }.start(); }}布局文件
感谢各位的阅读,以上就是"Android中怎么自定义view实现圆环进度条效果"的内容了,经过本文的学习后,相信大家对Android中怎么自定义view实现圆环进度条效果这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
进度
圆环
画笔
颜色
效果
百分
百分比
圆弧
宽度
属性
文字
线程
学习
最大
内容
字体
字符
字符串
锯齿
问题
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
江苏创新网络技术服务哪家好
佛山销售软件开发报价
学生网络安全教学
数据库专家 招聘
服务器的防护措施
网络安全通报机制办法
深圳专业软件开发怎么样
计算机网络技术专业3年规划
plant3d导入数据库
关于阿里云服务器数据安全
什么情况下危害网络安全
国家网络安全宣传作文题目
部队网络安全周宣传活动总结
pasteur数据库
梦幻西游不是一个服务器
虚拟机服务器搭建
能不能投资软件开发公司避税
潮州的软件开发
昆山软件开发开发商
免费 mysql数据库
拨号失败与服务器
网络游戏用什么数据库
北京健康宝的网络安全由谁负责
http协议访问游戏服务器
图形服务器散热
网络安全讨论交流部队
天津迅腾国际软件开发靠谱吗
微信开放平台官方服务器
金山区服务器回收厂家哪家便宜
计算机网络技术行业基本情况