Android圆形进度条控件-CircleSeekBar

Android圆形进度条控件-CircleSeekBar

1.引言

博主Android开发起步没多久,一脚踏入社会工作。对Android可以说是非常的喜欢,这里花了一天多的时间写了一个圆形进度条的控件,没有参考其他类似控件的实现方式。如果有什么好的建议,或者需要我改善的,希望大家能够指出,和你们一起进步哦。
另外项目我已经放到Git上,大家可以随意使用。CircleSeekBar项目地址:https://github.com/Hellobird/CircleSeekBar-For-Android

2.预览图

感觉效果还可以吧,下面讲下主要的方法。

3.主要方法

首先该类是继承自View类的,重写了onDraw、onMeasure方法。onDraw主要控制界面的绘制,onMeasure主要计算了一些重要参数,列如进度条边框的Rect,View的高度宽度等。

3.1 onDraw()方法

该方法因为是绘制调用的方法,所以不能涉及大量的运算,或者声明变量。这里主要是包括进度的绘制,文字的绘制,以及淡入淡出效果、缩放效果效果的设置。进度绘制主要使用了drawArc()这个方法,可以根据自己的设定画弧。动画的刷新主要靠判断当当前进度还未到达目标进度时,会调用invalidate()继续刷新。我也不知道常用滑动效果是否是这样不断刷新出来的,如果有更好的方法务必请告诉我一下。
[java]  view plain  copy
  1. <span style="white-space:pre">    </span>@Override  
  2.     protected void onDraw(Canvas canvas) {  
  3.         // 判断当前角度偏移方向  
  4.         if (mCurrentAngle > mTargetAngle) {  
  5.             mCurrentAngle = mCurrentAngle - mVelocity;  
  6.             if (mCurrentAngle < mTargetAngle) {  
  7.                 mCurrentAngle = mTargetAngle;  
  8.             }  
  9.         } else if (mCurrentAngle < mTargetAngle) {  
  10.             mCurrentAngle = mCurrentAngle + mVelocity;  
  11.             if (mCurrentAngle > mTargetAngle) {  
  12.                 mCurrentAngle = mTargetAngle;  
  13.             }  
  14.         }  
  15.         float ratio = mCurrentAngle / 360f;  
  16.         // 设置透明度  
  17.         if (mFadeEnable) {  
  18.             int alpha = (int) ((mEndAlpha - mStartAlpha) * ratio);  
  19.             mProgressPaint.setAlpha(alpha);  
  20.         }  
  21.         // 设置二级进度缩放效果  
  22.         if (mZoomEnable) {  
  23.             zoomSProgressRect(ratio);  
  24.         }  
  25.         // 绘制二级进度条  
  26.         canvas.drawArc(mSProgressRect, 0, 360f, false, mSProgressPaint);  
  27.         // 绘制进度条  
  28.         canvas.drawArc(mProgressRect, mStartAngle, mCurrentAngle, mUseCenter,  
  29.                 mProgressPaint);  
  30.         // 绘制字体  
  31.         if (mShowText) {  
  32.             String text = formatProgress(mCurrentAngle / 360f * mMaxProgress);  
  33.             mTextPaint.getTextBounds(text, 0, text.length(), mTextBounds);  
  34.             canvas.drawText(text, (getWidth() - mTextBounds.width()) >> 1,  
  35.                     (getHeight() >> 1) + (mTextBounds.height() >> 1),  
  36.                     mTextPaint);  
  37.         }  
  38.         // 如果当前进度不等于目标进度,继续绘制  
  39.         if (mCurrentAngle != mTargetAngle) {  
  40.             invalidate();  
  41.         }  
  42.     }  

3.2 onMeasure()方法

该方法主要是计算控件所需空间,以及确定进度环绘制的位置。这里的计算凡是除以2的,我都用的位运算替代,因为这个比除法快多了,不过不知道是否有隐患,知道的高手希望能解答一下。

[java]  view plain  copy
  1. <span style="white-space:pre">    </span>@Override  
  2.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  3.         /* 计算控件宽度与高度 */  
  4.         int widthMode = MeasureSpec.getMode(widthMeasureSpec);  
  5.         int widthSize = MeasureSpec.getSize(widthMeasureSpec);  
  6.         int heightMode = MeasureSpec.getMode(heightMeasureSpec);  
  7.         int heightSize = MeasureSpec.getSize(heightMeasureSpec);  
  8.         int width;  
  9.         int height;  
  10.         if (widthMode == MeasureSpec.EXACTLY) {  
  11.             width = widthSize;  
  12.         } else {  
  13.             int desired = (int) (getPaddingLeft()  
  14.                     + DimenUtils.dip2px(mContext, MIN_WIDTH) + getPaddingRight());  
  15.             width = desired;  
  16.         }  
  17.         if (heightMode == MeasureSpec.EXACTLY) {  
  18.             height = heightSize;  
  19.         } else {  
  20.             int desired = (int) (getPaddingTop()  
  21.                     + DimenUtils.dip2px(mContext, MIN_HEIGHT) + getPaddingBottom());  
  22.             height = desired;  
  23.         }  
  24.         setMeasuredDimension(width, height);  
  25.         /* 计算进度显示的矩形框 */  
  26.         float radius = width > height ? height >> 1 : width >> 1;  
  27.         float maxStrokeWidth = mProgressStrokeWidth > mSProgressStrokeWidth ? mProgressStrokeWidth  
  28.                 : mSProgressStrokeWidth;  
  29.         radius = radius - getMaxPadding() - maxStrokeWidth;  
  30.         int centerX = width >> 1;  
  31.         int centerY = height >> 1;  
  32.         mProgressRect.set(centerX - radius, centerY - radius, centerX + radius,  
  33.                 centerY + radius);  
  34.         mSProgressRect = new RectF(mProgressRect);  

3.3 控件属性定义

[html]  view plain  copy
  1. <resources>  
  2.   
  3.     <declare-styleable name="CircleSeekBar">  
  4.         <attr name="mode">  
  5.             <enum name="stroke" value="0" />  
  6.             <enum name="fill" value="1" />  
  7.             <enum name="fill_and_stroke" value="2" />  
  8.         </attr>  
  9.         <attr name="showText" format="boolean" />  
  10.         <attr name="startAngle" format="float" />  
  11.         <attr name="textSize" format="dimension" />  
  12.         <attr name="textColor" format="color" />  
  13.         <attr name="progressWidth" format="dimension" />  
  14.         <attr name="progressColor" format="color" />  
  15.         <attr name="sProgressWidth" format="dimension" />  
  16.         <attr name="sProgressColor" format="color" />  
  17.         <attr name="progress" format="float" />  
  18.         <attr name="maxProgress" format="float" />  
  19.         <attr name="velocity" format="float" />  
  20.         <attr name="fadeEnable" format="boolean" />  
  21.         <attr name="startAlpha" format="integer" />  
  22.         <attr name="endAlpha" format="integer" />  
  23.         <attr name="zoomEnable" format="boolean" />  
  24.     </declare-styleable>  
  25.   
  26. </resources>  

3.4总结

Android原生控件虽然少,但魅力就在可以随心所欲制定自己想要的控件和样式。这个方法里其实最重要的也就是onDraw和onMeasure方法,加起来一百来行代码,实现的效果感觉还不错。另外对控件有什么疑问或者是觉得可以改进和增加的效果,可以评论我哦。如果想要自己动手,也可以去git上挥洒你的代码。希望大家相互学习支持,让Android学习更加有趣。最后附上完整代码。

[java]  view plain  copy
  1. public class CircleSeekBar extends View {  
  2.   
  3.     /* 最小宽度,单位为dp */  
  4.     private static int MIN_WIDTH = 50;  
  5.   
  6.     /* 最小高度,单位为dp */  
  7.     private static int MIN_HEIGHT = 50;  
  8.   
  9.     /* 默认模式 */  
  10.     public static int MODE_DEFAULT = 0;  
  11.     /* 笔画模式 */  
  12.     public static int MODE_STROKE = 0;  
  13.     /* 填充模式 */  
  14.     public static int MODE_FILL = 1;  
  15.     /* 笔画&填充模式 */  
  16.     public static int MODE_FILL_AND_STROKE = 2;  
  17.   
  18.     /* 进度格式化默认值 */  
  19.     private static String PROGRESS_FORMAT_DEFAULT = "##0.0";  
  20.   
  21.     /* 进度默认最大值 */  
  22.     private static float MAX_PROGRESS_DEFAULT = 100f;  
  23.   
  24.     /* 开始位置角度默认值 */  
  25.     private static final float START_ANGLE_DEFAULT = 0f;  
  26.   
  27.     /* 刷新滑动速度默认值 */  
  28.     private static final float VELOCITY_DEFAULT = 3.0f;  
  29.   
  30.     /* 文字大小默认值,单位为sp */  
  31.     private static final float TEXT_SIZE_DEFAULT = 10.0f;  
  32.   
  33.     /* 默认文字颜色 */  
  34.     private static final int TEXT_COLOR_DEFAULT = 0xffbf5252;  
  35.   
  36.     /* 进度条边框宽度默认值,单位为dp */  
  37.     private static final float PROGRESS_WIDTH_DEFAULT = 5.0f;  
  38.   
  39.     /* 默认进度颜色 */  
  40.     private static final int PROGRESS_COLOR_DEFAULT = 0xff3d85c6;  
  41.   
  42.     /* 进度条底色默认值,单位为dp */  
  43.     private static final float S_PROGRESS_WIDTH_DEFAULT = 2.0f;  
  44.   
  45.     /* 默认进度颜色 */  
  46.     private static final int S_PROGRESS_COLOR_DEFAULT = 0xffdddddd;  
  47.   
  48.     private Context mContext;  
  49.     private Paint mPaint;  
  50.     private Paint mTextPaint;  
  51.     private Paint mProgressPaint;  
  52.     private Paint mSProgressPaint;  
  53.   
  54.     private int mMode; // 进度模式  
  55.     private float mMaxProgress; // 最大进度  
  56.     private boolean mShowText; // 是否显示文字  
  57.     private float mStartAngle; // 起始角度  
  58.     private float mVelocity; // 速度  
  59.     private float mTextSize; // 字体大小  
  60.     private int mTextColor; // 字体颜色  
  61.     private float mProgressStrokeWidth; // 进度条宽度  
  62.     private int mProgressColor; // 进度颜色  
  63.     private float mSProgressStrokeWidth; // 二级进度宽度  
  64.     private int mSProgressColor; // 二级进度颜色  
  65.     private boolean mFadeEnable; // 是否开启淡入淡出效果  
  66.     private int mStartAlpha; // 开始透明度,0~255  
  67.     private int mEndAlpha; // 结束透明度,0~255  
  68.     private boolean mZoomEnable; // 二级进度缩放  
  69.   
  70.     private RectF mProgressRect;  
  71.     private RectF mSProgressRect;  
  72.     private Rect mTextBounds;  
  73.   
  74.     private float mCurrentAngle; // 当前角度  
  75.     private float mTargetAngle; // 目标角度  
  76.     private boolean mUseCenter; // 是否从中心绘制  
  77.     private DecimalFormat mFormat; // 格式化数值  
  78.   
  79.     public CircleSeekBar(Context context, AttributeSet attrs) {  
  80.         this(context, attrs, 0);  
  81.     }  
  82.   
  83.     public CircleSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {  
  84.         super(context, attrs, defStyleAttr);  
  85.         mContext = context;  
  86.         init(attrs);  
  87.     }  
  88.   
  89.     private void init(AttributeSet attrs) {  
  90.         if (attrs != null) {  
  91.             TypedArray type = mContext.obtainStyledAttributes(attrs,  
  92.                     R.styleable.CircleSeekBar);  
  93.             mMode = type.getInt(R.styleable.CircleSeekBar_mode, MODE_DEFAULT);  
  94.             mMaxProgress = type.getFloat(R.styleable.CircleSeekBar_maxProgress,  
  95.                     MAX_PROGRESS_DEFAULT);  
  96.             mShowText = type.getBoolean(R.styleable.CircleSeekBar_showText,  
  97.                     true);  
  98.             mStartAngle = type.getFloat(R.styleable.CircleSeekBar_startAngle,  
  99.                     START_ANGLE_DEFAULT);  
  100.             mVelocity = type.getFloat(R.styleable.CircleSeekBar_velocity,  
  101.                     VELOCITY_DEFAULT);  
  102.             mTextSize = type.getDimension(R.styleable.CircleSeekBar_textSize,  
  103.                     DimenUtils.dip2px(mContext, TEXT_SIZE_DEFAULT));  
  104.             mTextColor = type.getColor(R.styleable.CircleSeekBar_textColor,  
  105.                     TEXT_COLOR_DEFAULT);  
  106.             mProgressStrokeWidth = type.getDimension(  
  107.                     R.styleable.CircleSeekBar_progressWidth,  
  108.                     DimenUtils.dip2px(mContext, PROGRESS_WIDTH_DEFAULT));  
  109.             mProgressColor = type.getColor(  
  110.                     R.styleable.CircleSeekBar_progressColor,  
  111.                     PROGRESS_COLOR_DEFAULT);  
  112.             mSProgressStrokeWidth = type.getDimension(  
  113.                     R.styleable.CircleSeekBar_sProgressWidth,  
  114.                     DimenUtils.dip2px(mContext, S_PROGRESS_WIDTH_DEFAULT));  
  115.             mSProgressColor = type.getColor(  
  116.                     R.styleable.CircleSeekBar_sProgressColor,  
  117.                     S_PROGRESS_COLOR_DEFAULT);  
  118.             mFadeEnable = type.getBoolean(R.styleable.CircleSeekBar_fadeEnable,  
  119.                     false);  
  120.             mStartAlpha = type  
  121.                     .getInt(R.styleable.CircleSeekBar_startAlpha, 255);  
  122.             mEndAlpha = type.getInt(R.styleable.CircleSeekBar_endAlpha, 255);  
  123.             mZoomEnable = type.getBoolean(R.styleable.CircleSeekBar_zoomEnable,  
  124.                     false);  
  125.             float progress = type.getFloat(R.styleable.CircleSeekBar_progress,  
  126.                     0);  
  127.             progress = progress > mMaxProgress || progress < 0f ? 0f : progress;  
  128.             mTargetAngle = progress / mMaxProgress * 360f;  
  129.             mCurrentAngle = mTargetAngle;  
  130.   
  131.             type.recycle();  
  132.         } else {  
  133.             mMode = MODE_DEFAULT;  
  134.             mMaxProgress = MAX_PROGRESS_DEFAULT;  
  135.             mStartAngle = START_ANGLE_DEFAULT;  
  136.             mVelocity = VELOCITY_DEFAULT;  
  137.             mTextSize = TEXT_SIZE_DEFAULT;  
  138.             mTextColor = TEXT_COLOR_DEFAULT;  
  139.             mProgressStrokeWidth = PROGRESS_WIDTH_DEFAULT;  
  140.             mProgressColor = PROGRESS_COLOR_DEFAULT;  
  141.             mSProgressStrokeWidth = S_PROGRESS_WIDTH_DEFAULT;  
  142.             mSProgressColor = S_PROGRESS_COLOR_DEFAULT;  
  143.             mTargetAngle = 0f;  
  144.             mCurrentAngle = 0f;  
  145.             mStartAlpha = 255;  
  146.             mEndAlpha = 255;  
  147.             mZoomEnable = false;  
  148.         }  
  149.         mPaint = new Paint();  
  150.         mPaint.setAntiAlias(true);  
  151.         mTextPaint = new Paint(mPaint);  
  152.         mTextPaint.setColor(mTextColor);  
  153.         mTextPaint.setTextSize(mTextSize);  
  154.         mProgressPaint = new Paint(mPaint);  
  155.         mProgressPaint.setColor(mProgressColor);  
  156.         mProgressPaint.setStrokeWidth(mProgressStrokeWidth);  
  157.         mSProgressPaint = new Paint(mProgressPaint);  
  158.         mSProgressPaint.setColor(mSProgressColor);  
  159.         mSProgressPaint.setStrokeWidth(mSProgressStrokeWidth);  
  160.         if (mMode == MODE_FILL_AND_STROKE) {  
  161.             mProgressPaint.setStyle(Style.FILL);  
  162.             mSProgressPaint.setStyle(Style.FILL_AND_STROKE);  
  163.             mUseCenter = true;  
  164.         } else if (mMode == MODE_FILL) {  
  165.             mProgressPaint.setStyle(Style.FILL);  
  166.             mSProgressPaint.setStyle(Style.FILL);  
  167.             mUseCenter = true;  
  168.         } else {  
  169.             mProgressPaint.setStyle(Style.STROKE);  
  170.             mSProgressPaint.setStyle(Style.STROKE);  
  171.             mUseCenter = false;  
  172.         }  
  173.   
  174.         mProgressRect = new RectF();  
  175.         mTextBounds = new Rect();  
  176.         mFormat = new DecimalFormat(PROGRESS_FORMAT_DEFAULT);  
  177.     }  
  178.   
  179.     @Override  
  180.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  181.         /* 计算控件宽度与高度 */  
  182.         int widthMode = MeasureSpec.getMode(widthMeasureSpec);  
  183.         int widthSize = MeasureSpec.getSize(widthMeasureSpec);  
  184.         int heightMode = MeasureSpec.getMode(heightMeasureSpec);  
  185.         int heightSize = MeasureSpec.getSize(heightMeasureSpec);  
  186.         int width;  
  187.         int height;  
  188.         if (widthMode == MeasureSpec.EXACTLY) {  
  189.             width = widthSize;  
  190.         } else {  
  191.             int desired = (int) (getPaddingLeft()  
  192.                     + DimenUtils.dip2px(mContext, MIN_WIDTH) + getPaddingRight());  
  193.             width = desired;  
  194.         }  
  195.         if (heightMode == MeasureSpec.EXACTLY) {  
  196.             height = heightSize;  
  197.         } else {  
  198.             int desired = (int) (getPaddingTop()  
  199.                     + DimenUtils.dip2px(mContext, MIN_HEIGHT) + getPaddingBottom());  
  200.             height = desired;  
  201.         }  
  202.         setMeasuredDimension(width, height);  
  203.         /* 计算进度显示的矩形框 */  
  204.         float radius = width > height ? height >> 1 : width >> 1;  
  205.         float maxStrokeWidth = mProgressStrokeWidth > mSProgressStrokeWidth ? mProgressStrokeWidth  
  206.                 : mSProgressStrokeWidth;  
  207.         radius = radius - getMaxPadding() - maxStrokeWidth;  
  208.         int centerX = width >> 1;  
  209.         int centerY = height >> 1;  
  210.         mProgressRect.set(centerX - radius, centerY - radius, centerX + radius,  
  211.                 centerY + radius);  
  212.         mSProgressRect = new RectF(mProgressRect);  
  213.     }  
  214.   
  215.     @Override  
  216.     protected void onDraw(Canvas canvas) {  
  217.         // 判断当前角度偏移方向  
  218.         if (mCurrentAngle > mTargetAngle) {  
  219.             mCurrentAngle = mCurrentAngle - mVelocity;  
  220.             if (mCurrentAngle < mTargetAngle) {  
  221.                 mCurrentAngle = mTargetAngle;  
  222.             }  
  223.         } else if (mCurrentAngle < mTargetAngle) {  
  224.             mCurrentAngle = mCurrentAngle + mVelocity;  
  225.             if (mCurrentAngle > mTargetAngle) {  
  226.                 mCurrentAngle = mTargetAngle;  
  227.             }  
  228.         }  
  229.         float ratio = mCurrentAngle / 360f;  
  230.         // 设置透明度  
  231.         if (mFadeEnable) {  
  232.             int alpha = (int) ((mEndAlpha - mStartAlpha) * ratio);  
  233.             mProgressPaint.setAlpha(alpha);  
  234.         }  
  235.         // 设置二级进度缩放效果  
  236.         if (mZoomEnable) {  
  237.             zoomSProgressRect(ratio);  
  238.         }  
  239.         // 绘制二级进度条  
  240.         canvas.drawArc(mSProgressRect, 0, 360f, false, mSProgressPaint);  
  241.         // 绘制进度条  
  242.         canvas.drawArc(mProgressRect, mStartAngle, mCurrentAngle, mUseCenter,  
  243.                 mProgressPaint);  
  244.         // 绘制字体  
  245.         if (mShowText) {  
  246.             String text = formatProgress(mCurrentAngle / 360f * mMaxProgress);  
  247.             mTextPaint.getTextBounds(text, 0, text.length(), mTextBounds);  
  248.             canvas.drawText(text, (getWidth() - mTextBounds.width()) >> 1,  
  249.                     (getHeight() >> 1) + (mTextBounds.height() >> 1),  
  250.                     mTextPaint);  
  251.         }  
  252.         // 如果当前进度不等于目标进度,继续绘制  
  253.         if (mCurrentAngle != mTargetAngle) {  
  254.             invalidate();  
  255.         }  
  256.     }  
  257.   
  258.     /** 
  259.      * 格式化进度 
  260.      *  
  261.      * @param progress 
  262.      * @return 
  263.      */  
  264.     private String formatProgress(float progress) {  
  265.         return mFormat.format(progress);  
  266.     }  
  267.   
  268.     /** 
  269.      * 获取内边距最大值 
  270.      *  
  271.      * @return 
  272.      */  
  273.     private int getMaxPadding() {  
  274.         int maxPadding = getPaddingLeft();  
  275.         int paddingRight = getPaddingRight();  
  276.         int paddingTop = getPaddingTop();  
  277.         int paddingBottom = getPaddingBottom();  
  278.         if (maxPadding < paddingRight) {  
  279.             maxPadding = paddingRight;  
  280.         }  
  281.         if (maxPadding < paddingTop) {  
  282.             maxPadding = paddingTop;  
  283.         }  
  284.         if (maxPadding < paddingBottom) {  
  285.             maxPadding = paddingBottom;  
  286.         }  
  287.         return maxPadding;  
  288.     }  
  289.   
  290.     /** 
  291.      * 缩放二级进度条 
  292.      *  
  293.      * @param ratio 
  294.      */  
  295.     private void zoomSProgressRect(float ratio) {  
  296.         float width = mProgressRect.width();  
  297.         float height = mProgressRect.height();  
  298.         float centerX = mProgressRect.centerX();  
  299.         float centerY = mProgressRect.centerY();  
  300.         float offsetX = width * 0.5f * ratio;  
  301.         float offsetY = height * 0.5f * ratio;  
  302.         float left = centerX - offsetX;  
  303.         float right = centerX + offsetX;  
  304.         float top = centerY - offsetY;  
  305.         float bottom = centerY + offsetY;  
  306.         mSProgressRect.set(left, top, right, bottom);  
  307.     }  
  308.   
  309.     @Override  
  310.     protected void onDisplayHint(int hint) {  
  311.         if (hint == View.VISIBLE) {  
  312.             mCurrentAngle = 0;  
  313.             invalidate();  
  314.         }  
  315.         super.onDisplayHint(hint);  
  316.     }  
  317.   
  318.     /** 
  319.      * 设置目标进度 
  320.      *  
  321.      * @param progress 
  322.      */  
  323.     public void setProgress(float progress) {  
  324.         progress = progress > mMaxProgress || progress < 0f ? 0f : progress;  
  325.         mTargetAngle = progress / mMaxProgress * 360f;  
  326.         postInvalidate();  
  327.     }  
  328.   
  329.     /** 
  330.      * 设置目标进度 
  331.      *  
  332.      * @param progress 
  333.      *            进度值 
  334.      * @param isAnim 
  335.      *            是否有动画 
  336.      */  
  337.     public void setProgressWithAnim(float progress, boolean isAnim) {  
  338.         if (isAnim) {  
  339.             setProgress(progress);  
  340.         } else {  
  341.             progress = progress > mMaxProgress || progress < 0f ? 0f : progress;  
  342.             mCurrentAngle = progress / mMaxProgress * 360f;  
  343.             mTargetAngle = mCurrentAngle;  
  344.             postInvalidate();  
  345.         }  
  346.     }  
  347.   
  348.     /** 
  349.      * 设置进度画笔着色方式 
  350.      *  
  351.      * @param shader 
  352.      */  
  353.     public void setProgressShader(Shader shader) {  
  354.         this.mProgressPaint.setShader(shader);  
  355.         invalidate();  
  356.     }  
  357.   
  358.     /** 
  359.      * 设置二级进度画笔着色方式 
  360.      *  
  361.      * @param shader 
  362.      */  
  363.     public void setSProgressShader(Shader shader) {  
  364.         this.mSProgressPaint.setShader(shader);  
  365.         invalidate();  
  366.     }  
  367.   
  368.     public void setMaxProgress(float max) {  
  369.         this.mMaxProgress = max;  
  370.     }  
  371.   
  372.     public float getMaxProgress() {  
  373.         return mMaxProgress;  
  374.     }  
  375.   
  376.     public int getMode() {  
  377.         return mMode;  
  378.     }  
  379.   
  380.     public void setMode(int mMode) {  
  381.         this.mMode = mMode;  
  382.     }  
  383.   
  384.     public float getStartAngle() {  
  385.         return mStartAngle;  
  386.     }  
  387.   
  388.     public void setStartAngle(float mStartAngle) {  
  389.         this.mStartAngle = mStartAngle;  
  390.     }  
  391.   
  392.     public float getVelocity() {  
  393.         return mVelocity;  
  394.     }  
  395.   
  396.     public void setVelocity(float mVelocity) {  
  397.         this.mVelocity = mVelocity;  
  398.     }  
  399.   
  400.     public float getTextSize() {  
  401.         return mTextSize;  
  402.     }  
  403.   
  404.     public void setTextSize(float mTextSize) {  
  405.         this.mTextSize = mTextSize;  
  406.     }  
  407.   
  408.     public int getTextColor() {  
  409.         return mTextColor;  
  410.     }  
  411.   
  412.     public void setTextColor(int mTextColor) {  
  413.         this.mTextColor = mTextColor;  
  414.     }  
  415.   
  416.     public float getProgressStrokeWidth() {  
  417.         return mProgressStrokeWidth;  
  418.     }  
  419.   
  420.     public void setProgressStrokeWidth(float mProgressStrokeWidth) {  
  421.         this.mProgressStrokeWidth = mProgressStrokeWidth;  
  422.     }  
  423.   
  424.     public int getProgressColor() {  
  425.         return mProgressColor;  
  426.     }  
  427.   
  428.     public void setProgressColor(int mProgressColor) {  
  429.         this.mProgressColor = mProgressColor;  
  430.     }  
  431.   
  432.     public float getSProgressStrokeWidth() {  
  433.         return mSProgressStrokeWidth;  
  434.     }  
  435.   
  436.     public void setSProgressStrokeWidth(float mSProgressStrokeWidth) {  
  437.         this.mSProgressStrokeWidth = mSProgressStrokeWidth;  
  438.     }  
  439.   
  440.     public int getSProgressColor() {  
  441.         return mSProgressColor;  
  442.     }  
  443.   
  444.     public void setSProgressColor(int mSProgressColor) {  
  445.         this.mSProgressColor = mSProgressColor;  
  446.     }  
  447.   
  448.     public boolean isFadeEnable() {  
  449.         return mFadeEnable;  
  450.     }  
  451.   
  452.     public void setFadeEnable(boolean mFadeEnable) {  
  453.         this.mFadeEnable = mFadeEnable;  
  454.     }  
  455.   
  456.     public int getStartAlpha() {  
  457.         return mStartAlpha;  
  458.     }  
  459.   
  460.     public void setStartAlpha(int mStartAlpha) {  
  461.         this.mStartAlpha = mStartAlpha;  
  462.     }  
  463.   
  464.     public int getEndAlpha() {  
  465.         return mEndAlpha;  
  466.     }  
  467.   
  468.     public void setEndAlpha(int mEndAlpha) {  
  469.         this.mEndAlpha = mEndAlpha;  
  470.     }  
  471.   
  472.     public boolean isZoomEnable() {  
  473.         return mZoomEnable;  
  474.     }  
  475.   
  476.     public void setZoomEnable(boolean mZoomEnable) {  
  477.         this.mZoomEnable = mZoomEnable;  
  478.     }  
  479. }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 Android 自定义进度条控件的实现,我可以为您提供一些思路和示例代码。 首先,我们需要继承自 View 或者 ProgressBar,然后在 onDraw 方法中实现自己的绘制逻辑。具体来说,需要绘制背景、进度条和文本等内容。 示例代码如下: ```java public class CustomProgressBar extends ProgressBar { private Paint mPaint; private String mText; private Rect mRect; public CustomProgressBar(Context context) { super(context); init(); } public CustomProgressBar(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CustomProgressBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); mRect = new Rect(); } @Override protected synchronized void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制背景 mPaint.setColor(Color.GRAY); mPaint.setStyle(Paint.Style.FILL); canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint); // 绘制进度条 mPaint.setColor(Color.BLUE); mPaint.setStyle(Paint.Style.FILL); float progress = getProgress() * 1.0f / getMax(); canvas.drawRect(0, 0, getWidth() * progress, getHeight(), mPaint); // 绘制文本 mPaint.setColor(Color.WHITE); mPaint.setTextSize(24); mText = getProgress() + "%"; mPaint.getTextBounds(mText, 0, mText.length(), mRect); float x = getWidth() / 2f - mRect.centerX(); float y = getHeight() / 2f - mRect.centerY(); canvas.drawText(mText, x, y, mPaint); } } ``` 这个自定义控件实现了一个简单的水平进度条,包括了背景、进度条和文本三个部分。当然,您可以根据自己的需求进行更改和扩展。 希望这个示例代码能够帮助到您,如果您还有其他问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值