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); //设置字体}@Overrideprotected 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; @Overrideprotected 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(){@Overridepublic 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第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- SpringBoot调用公共模块的自定义注解失效的解决
- python自定义封装带颜色的logging模块
- 列出所有自定义的function和view
- android|android studio中ndk的使用
- tableView|tableView 头视图下拉放大 重写
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)