欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

自定义圆环progressbar

发布时间:2025/6/15 编程问答 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 自定义圆环progressbar 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
RoundProgressBar.java
  • /**
  • * RoundProgressBar.java [v1.0.0]
  • * classes: com.example.audiorecordingtest.RoundProgressBar
  • * Amanda Create at 2014年10月10日 下午4:16:45
  • * Copyright 阳光健康信息技术有限公司
  • */
  • package com.example.audiorecordingtest.view;
  • /**
  • * com.example.audiorecordingtest.RoundProgressBar
  • * @author Amanda
  • * create at 2014年10月10日 下午4:16:45
  • */
  • import com.example.audiorecordingtest.R;
  • import com.example.audiorecordingtest.R.styleable;
  • 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.view.View;
  • /**
  • * 仿iphone带进度的进度条,线程安全的View,可直接在线程中更新进度
  • *
  • */
  • public class RoundProgressBar extends View {
  • /**
  • * 画笔对象的引用
  • */
  • private Paint paint;
  • /**
  • * 圆环的颜色
  • */
  • private int roundColor;
  • /**
  • * 圆环进度的颜色
  • */
  • private int roundProgressColor;
  • /**
  • * 中间进度百分比的字符串的颜色
  • */
  • private int textColor;
  • /**
  • * 中间进度百分比的字符串的字体
  • */
  • private float textSize;
  • /**
  • * 圆环的宽度
  • */
  • private float roundWidth;
  • /**
  • * 最大进度
  • */
  • private int max;
  • /**
  • * 当前进度
  • */
  • private int progress;
  • /**
  • * 是否显示中间的进度
  • */
  • private boolean textIsDisplayable;
  • /**
  • * 进度的风格,实心或者空心
  • */
  • private int style;
  • public static final int STROKE = 0;
  • public static final int FILL = 1;
  • public RoundProgressBar(Context context) {
  • this(context, null);
  • }
  • public RoundProgressBar(Context context, AttributeSet attrs) {
  • this(context, attrs, 0);
  • }
  • public RoundProgressBar(Context context, AttributeSet attrs, int defStyle) {
  • super(context, attrs, defStyle);
  • paint = new Paint();
  • TypedArray mTypedArray = context.obtainStyledAttributes(attrs,
  • R.styleable.RoundProgressBar);
  • //获取自定义属性和默认值
  • roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.rgb(245, 252, 248));
  • roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.rgb(62, 187, 102));
  • textColor = mTypedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.BLACK);
  • textSize = mTypedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);
  • roundWidth = mTypedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 5);
  • max = mTypedArray.getInteger(R.styleable.RoundProgressBar_max, 100);
  • textIsDisplayable = mTypedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);
  • style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);
  • mTypedArray.recycle();
  • }
  • @Override
  • protected void onDraw(Canvas canvas) {
  • super.onDraw(canvas);
  • /**
  • * 画最外层的大圆环
  • */
  • int centerX = getWidth()/2;
  • int centerY = getHeight()/2;
  • int centre = centerX>centerY?centerY:centerX;
  • int radius = (int) (centre - roundWidth/2); //圆环的半径
  • paint.setColor(roundColor); //设置圆环的颜色
  • paint.setStyle(Paint.Style.STROKE); //设置空心
  • paint.setStrokeWidth(roundWidth); //设置圆环的宽度
  • paint.setAntiAlias(true); //消除锯齿
  • canvas.drawCircle(centerX, centerY, radius, paint); //画出圆环
  • // Log.e("log", centre + "");
  • /**
  • * 画进度百分比
  • */
  • paint.setStrokeWidth(0);
  • paint.setColor(textColor);
  • paint.setTextSize(textSize);
  • paint.setTypeface(Typeface.DEFAULT_BOLD); //设置字体
  • int percent = (int)(((float)progress / (float)max) * 100); //中间的进度百分比,先转换成float在进行除法运算,不然都为0
  • float textWidth = paint.measureText(percent + "%"); //测量字体宽度,我们需要根据字体的宽度设置在圆环中间
  • if(textIsDisplayable && percent != 0 && style == STROKE){
  • canvas.drawText(percent + "%", centerX - textWidth / 2, centerY + textSize/2, paint); //画出进度百分比
  • }
  • /**
  • * 画圆弧 ,画圆环的进度
  • */
  • //设置进度是实心还是空心
  • paint.setStrokeWidth(roundWidth); //设置圆环的宽度
  • paint.setColor(roundProgressColor); //设置进度的颜色
  • RectF oval = new RectF(centerX - radius, centerY - radius, centerX
  • + radius, centerY + radius); //用于定义的圆弧的形状和大小的界限
  • switch (style) {
  • case STROKE:{
  • paint.setStyle(Paint.Style.STROKE);
  • canvas.drawArc(oval, 90, 360 * progress / max, false, paint); //根据进度画圆弧
  • break;
  • }
  • case FILL:{
  • paint.setStyle(Paint.Style.FILL_AND_STROKE);
  • if(progress !=0){
  • canvas.drawArc(oval, 90, 360 * progress / max, true, paint); //根据进度画圆弧
  • }
  • break;
  • }
  • }
  • }
  • 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 getCricleColor() {
  • return roundColor;
  • }
  • public void setCricleColor(int cricleColor) {
  • this.roundColor = cricleColor;
  • }
  • public int getCricleProgressColor() {
  • return roundProgressColor;
  • }
  • public void setCricleProgressColor(int cricleProgressColor) {
  • this.roundProgressColor = cricleProgressColor;
  • }
  • 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 getRoundWidth() {
  • return roundWidth;
  • }
  • public void setRoundWidth(float roundWidth) {
  • this.roundWidth = roundWidth;
  • }
  • }

  • values/attrs.xml
  • <?xml version="1.0" encoding="utf-8"?>
  • <resources>
  • <declare-styleable name="RoundProgressBar">
  • <attr name="roundColor" format="color"/>
  • <attr name="roundProgressColor" format="color"/>
  • <attr name="roundWidth" format="dimension"></attr>
  • <attr name="textColor" format="color" />
  • <attr name="textSize" format="dimension" />
  • <attr name="max" format="integer"></attr>
  • <attr name="textIsDisplayable" format="boolean"></attr>
  • <attr name="style">
  • <enum name="STROKE" value="0"></enum>
  • <enum name="FILL" value="1"></enum>
  • </attr>
  • </declare-styleable>
  • </resources>



  • layout/audiorecord.xml
  • <?xml version="1.0" encoding="utf-8"?>
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  • xmlns:android_custom="http://schemas.android.com/apk/res/com.example.audiorecordingtest"
  • android:layout_width="match_parent"
  • android:layout_height="match_parent"
  • android:orientation="vertical"
  • android:gravity="center">
  • <FrameLayout
  • android:layout_width="match_parent"
  • android:layout_height="0dp"
  • android:layout_weight="2">
  • <ImageView
  • android:id="@+id/img_microfan"
  • android:layout_width="wrap_content"
  • android:layout_height="wrap_content"
  • android:layout_gravity="center"
  • android:src="@drawable/microfan"
  • android:scaleType="centerInside"/>
  • <com.example.audiorecordingtest.view.RoundProgressBar
  • android:id="@+id/roundProgressBar"
  • android:layout_width="match_parent"
  • android:layout_height="match_parent"
  • android_custom:roundColor="#f6fcf8"
  • android_custom:roundProgressColor="#41c36b"
  • android_custom:textIsDisplayable="false"
  • android_custom:roundWidth="5dp"/>
  • </FrameLayout>
  • <TextView
  • android:id="@+id/txt_microfan"
  • android:layout_width="match_parent"
  • android:layout_height="0dp"
  • android:layout_weight="1"
  • android:gravity="center"
  • android:text="正在录音……"
  • android:textColor="#3c3c3c"
  • android:textSize="30px"/>
  • </LinearLayout>



  • 来自为知笔记(Wiz)

    总结

    以上是生活随笔为你收集整理的自定义圆环progressbar的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。