Android中怎么自定义view实现圆环进度条效果
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要讲解了"Android中怎么自定义view实现圆环进度条效果",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android中怎么自定义vie
千家信息网最后更新 2025年01月31日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安全错误
数据库的锁怎样保障安全
移动公司网络安全工资
大学生信息与网络安全
安岳租房软件开发
网络安全的基本要求是
服务器硬盘不显示容量
数据库如何分离外键
推荐服务器有32k的
数据库技术学分是多少
服务器安规测试项目有哪些
工程信息化与计算机网络安全
数据库符号大全
pl/sql数据库登录不上
致远服务器地址怎么设置
关于软件开发的企划书
北京码链网络技术有限公司
软件开发实习生面试应该注意什么
天河软件园配资软件开发
软件开发最全文档
软件开发什么笔记本
软件开发生产者消费者
软件开发所属什么行业
网络安全年会举办
数据库如何代码建表
周易八卦数据库出售
12月23日网络安全大会
网络安全自查自纠整改方案
木瓜互联网科技手抄报素材英语
任我行网络技术怎么样
数据库安全软件
阿里巴巴的网络技术标准