您好,登錄后才能下訂單哦!
這篇文章主要講解了android如何實現評分圓形進度條,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
本文實例為大家分享了android評分圓形進度條的具體代碼,供大家參考,具體內容如下
一、測試截圖
二、實現原理
package com.freedomanlib; import java.util.Timer; import java.util.TimerTask; import android.annotation.SuppressLint; import android.content.Context; 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.MotionEvent; import android.view.View; /** * @name GradeProgressBar * @Descripation 自定義等級評分圓形進度條,用于設備數據統計頁面一鍵評分<br> * 1、初始化邊界寬度、中心坐標和外環、內環半徑,各種畫筆。<br> * 2、默認最大進度為100,目標進度由用戶來指定。<br> * 3、鎖定一個內圓環為可點擊區域。 <br> * 4、點擊組件時,調用start()方法啟動計時器,重繪界面。<br> * @author Freedoman * @date 2014-10-29 * @version 1.0 */ public class GradeProgressBar extends View { private static final String TAG = "CircleProgressBar"; /** * 邊界寬度、中心坐標和外環、內環半徑 */ private float boundsWidth; private float centerPoint; private float overRadius; private float radius; /** * 最大進度、當前進度、是否顯示進度文本 */ private float maxProgress = 100; private float targetProgress; private int curProgress; /** * 幾種畫筆 */ private Paint overRoundPaint; private Paint roundPaint; private Paint progressRoundPaint; private Paint progressTextPaint; private Paint textPaint; /** * 可點擊區域的邊界 */ private float clickBoundsLow; private float clickBoundsHigh; private onProgressChangedListener listener; public GradeProgressBar(Context context) { this(context, null); } public GradeProgressBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public GradeProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.initialize(); } /** * 初始化 */ private void initialize() { curProgress = 0; int whiteColor = Color.rgb(0xF0, 0xF0, 0xF0); // 外環畫筆 overRoundPaint = new Paint(); overRoundPaint.setColor(whiteColor); overRoundPaint.setStyle(Paint.Style.STROKE); overRoundPaint.setStrokeWidth(8); overRoundPaint.setAntiAlias(true); // 內環畫筆 roundPaint = new Paint(); roundPaint.setColor(Color.GRAY); roundPaint.setStrokeWidth(30); roundPaint.setStyle(Paint.Style.STROKE); roundPaint.setAntiAlias(true); // 進度環畫筆(除顏色外同于內環) progressRoundPaint = new Paint(); progressRoundPaint.setColor(Color.rgb(0xFF, 0x92, 0x24)); progressRoundPaint.setStrokeWidth(20); progressRoundPaint.setStyle(Paint.Style.STROKE); roundPaint.setAntiAlias(true); // 進度文本畫筆 progressTextPaint = new Paint(); progressTextPaint.setColor(whiteColor); progressTextPaint.setStyle(Paint.Style.STROKE); progressTextPaint.setStrokeWidth(0); progressTextPaint.setTextSize(80); progressTextPaint.setTypeface(Typeface.DEFAULT_BOLD); // 文本畫筆 textPaint = new Paint(); textPaint.setColor(whiteColor); textPaint.setStyle(Paint.Style.STROKE); textPaint.setStrokeWidth(0); textPaint.setTextSize(40); textPaint.setTypeface(Typeface.DEFAULT_BOLD); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 取當前布局的最短邊作為邊框的長度 float width = getWidth(); float heigh = getHeight(); boundsWidth = width <= heigh ? width : heigh; // 中心點 centerPoint = boundsWidth / 2; // 外環半徑 overRadius = centerPoint - 20; // 內環半徑 radius = overRadius - 25; // 內環所在區域(正方形)鎖定為可點擊區域 clickBoundsLow = centerPoint - radius; clickBoundsHigh = centerPoint + radius; } /** * 啟動進度動畫 */ public void start() { curProgress = 0; if (targetProgress == 0) { targetProgress = 66; } final Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { curProgress++; if (curProgress == targetProgress) { timer.cancel(); } postInvalidate(); } }; timer.schedule(timerTask, 0, 20); } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 外環 canvas.drawCircle(centerPoint, centerPoint, overRadius, overRoundPaint); // 內環 canvas.drawCircle(centerPoint, centerPoint, radius, roundPaint); // 進度環 RectF oval = new RectF(centerPoint - radius, centerPoint - radius, centerPoint + radius, centerPoint + radius); float curArc = 360 * curProgress / maxProgress; canvas.drawArc(oval, 0, curArc, false, progressRoundPaint); // 環中心進度文本 int curPercent = (int) ((curProgress / maxProgress) * 100); float textWidth = progressTextPaint.measureText(curPercent + "%"); canvas.drawText(curPercent + "%", centerPoint - textWidth / 2, centerPoint, progressTextPaint); if (curPercent == 0) { // 暫未評級 float w = textPaint.measureText("暫未評級"); canvas.drawText("暫未評級", centerPoint - w / 2, centerPoint + 40, textPaint); } else if (curPercent < targetProgress) { // 評級中... float w = textPaint.measureText("評級中..."); canvas.drawText("評級中...", centerPoint - w / 2, centerPoint + 40, textPaint); } else if (curPercent == targetProgress) { // 評級完成 float w = textPaint.measureText("評級完成"); canvas.drawText("評級完成", centerPoint - w / 2, centerPoint + 40, textPaint); } // 對外傳遞數據 if (listener != null) { listener.progressChanged(GradeProgressBar.this, curProgress); } } public synchronized float getMaxProgress() { return maxProgress; } /** * 設置進度的最大值 * * @param max */ public synchronized void setMaxProgress(float max) { if (max < 0) { throw new IllegalArgumentException("max not less than 0"); } this.maxProgress = max; } /** * 獲取進度.需要同步 * * @return */ public synchronized float getProgress() { return targetProgress; } /** * 設置進度,此為線程安全控件,由于考慮多線的問題,需要同步 刷新界面調用postInvalidate()能在非UI線程刷新 * * @param progress */ public synchronized void setProgress(float progress) { if (progress < 0) { throw new IllegalArgumentException("progress not less than 0"); } if (progress > maxProgress) { progress = maxProgress; } if (progress <= maxProgress) { this.targetProgress = progress; } } public void setOnProgressChangedListener(onProgressChangedListener listener) { if (listener == null) { this.listener = listener; } } /** * 點擊評分區域,進行評分 * * @param event * @return */ @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); if (x > clickBoundsLow && x < clickBoundsHigh && y > clickBoundsLow && y < clickBoundsHigh) { start(); } return super.onTouchEvent(event); } /** * @name onProgressChangedListener * @Descripation 對外接口,提供當前旋轉進度<br> * 1、<br> * 2、<br> * @author Freedoman * @date 2014-10-29 * @version 1.0 */ public interface onProgressChangedListener { public void progressChanged(GradeProgressBar circleProgressBar, int curProgress); } }
看完上述內容,是不是對android如何實現評分圓形進度條有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。