欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

android自定義等級(jí)評(píng)分圓形進(jìn)度條

 更新時(shí)間:2020年07月16日 15:21:38   作者:Freedoman1990  
這篇文章主要為大家詳細(xì)介紹了android自定義等級(jí)評(píng)分圓形進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了android評(píng)分圓形進(jìn)度條的具體代碼,供大家參考,具體內(nèi)容如下

一、測(cè)試截圖

二、實(shí)現(xiàn)原理

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 自定義等級(jí)評(píng)分圓形進(jìn)度條,用于設(shè)備數(shù)據(jù)統(tǒng)計(jì)頁(yè)面一鍵評(píng)分<br>
 *  1、初始化邊界寬度、中心坐標(biāo)和外環(huán)、內(nèi)環(huán)半徑,各種畫筆。<br>
 *  2、默認(rèn)最大進(jìn)度為100,目標(biāo)進(jìn)度由用戶來(lái)指定。<br>
 *  3、鎖定一個(gè)內(nèi)圓環(huán)為可點(diǎn)擊區(qū)域。 <br>
 *  4、點(diǎn)擊組件時(shí),調(diào)用start()方法啟動(dòng)計(jì)時(shí)器,重繪界面。<br>
 * @author Freedoman
 * @date 2014-10-29
 * @version 1.0
 */
public class GradeProgressBar extends View {
 
 private static final String TAG = "CircleProgressBar";
 
 /**
 * 邊界寬度、中心坐標(biāo)和外環(huán)、內(nèi)環(huán)半徑
 */
 private float boundsWidth;
 private float centerPoint;
 private float overRadius;
 private float radius;
 
 /**
 * 最大進(jìn)度、當(dāng)前進(jìn)度、是否顯示進(jìn)度文本
 */
 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;
 
 /**
 * 可點(diǎn)擊區(qū)域的邊界
 */
 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);
 
 // 外環(huán)畫筆
 overRoundPaint = new Paint();
 overRoundPaint.setColor(whiteColor);
 overRoundPaint.setStyle(Paint.Style.STROKE);
 overRoundPaint.setStrokeWidth(8);
 overRoundPaint.setAntiAlias(true);
 
 // 內(nèi)環(huán)畫筆
 roundPaint = new Paint();
 roundPaint.setColor(Color.GRAY);
 roundPaint.setStrokeWidth(30);
 roundPaint.setStyle(Paint.Style.STROKE);
 roundPaint.setAntiAlias(true);
 
 // 進(jìn)度環(huán)畫筆(除顏色外同于內(nèi)環(huán))
 progressRoundPaint = new Paint();
 progressRoundPaint.setColor(Color.rgb(0xFF, 0x92, 0x24));
 progressRoundPaint.setStrokeWidth(20);
 progressRoundPaint.setStyle(Paint.Style.STROKE);
 roundPaint.setAntiAlias(true);
 
 // 進(jìn)度文本畫筆
 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);
 
 // 取當(dāng)前布局的最短邊作為邊框的長(zhǎng)度
 float width = getWidth();
 float heigh = getHeight();
 boundsWidth = width <= heigh ? width : heigh;
 
 // 中心點(diǎn)
 centerPoint = boundsWidth / 2;
 // 外環(huán)半徑
 overRadius = centerPoint - 20;
 // 內(nèi)環(huán)半徑
 radius = overRadius - 25;
 
 // 內(nèi)環(huán)所在區(qū)域(正方形)鎖定為可點(diǎn)擊區(qū)域
 clickBoundsLow = centerPoint - radius;
 clickBoundsHigh = centerPoint + radius;
 }
 
 /**
 * 啟動(dòng)進(jìn)度動(dòng)畫
 */
 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);
 
 // 外環(huán)
 canvas.drawCircle(centerPoint, centerPoint, overRadius, overRoundPaint);
 // 內(nèi)環(huán)
 canvas.drawCircle(centerPoint, centerPoint, radius, roundPaint);
 
 // 進(jìn)度環(huán)
 RectF oval = new RectF(centerPoint - radius, centerPoint - radius,
 centerPoint + radius, centerPoint + radius);
 float curArc = 360 * curProgress / maxProgress;
 canvas.drawArc(oval, 0, curArc, false, progressRoundPaint);
 
 // 環(huán)中心進(jìn)度文本
 int curPercent = (int) ((curProgress / maxProgress) * 100);
 float textWidth = progressTextPaint.measureText(curPercent + "%");
 canvas.drawText(curPercent + "%", centerPoint - textWidth / 2,
 centerPoint, progressTextPaint);
 
 if (curPercent == 0) {
 // 暫未評(píng)級(jí)
 float w = textPaint.measureText("暫未評(píng)級(jí)");
 canvas.drawText("暫未評(píng)級(jí)", centerPoint - w / 2, centerPoint + 40,
 textPaint);
 } else if (curPercent < targetProgress) {
 // 評(píng)級(jí)中...
 float w = textPaint.measureText("評(píng)級(jí)中...");
 canvas.drawText("評(píng)級(jí)中...", centerPoint - w / 2, centerPoint + 40,
 textPaint);
 } else if (curPercent == targetProgress) {
 // 評(píng)級(jí)完成
 float w = textPaint.measureText("評(píng)級(jí)完成");
 canvas.drawText("評(píng)級(jí)完成", centerPoint - w / 2, centerPoint + 40,
 textPaint);
 }
 
 // 對(duì)外傳遞數(shù)據(jù)
 if (listener != null) {
 listener.progressChanged(GradeProgressBar.this, curProgress);
 }
 }
 
 public synchronized float getMaxProgress() {
 return maxProgress;
 }
 
 /**
 * 設(shè)置進(jìn)度的最大值
 * 
 * @param max
 */
 public synchronized void setMaxProgress(float max) {
 if (max < 0) {
 throw new IllegalArgumentException("max not less than 0");
 }
 this.maxProgress = max;
 }
 
 /**
 * 獲取進(jìn)度.需要同步
 * 
 * @return
 */
 public synchronized float getProgress() {
 return targetProgress;
 }
 
 /**
 * 設(shè)置進(jìn)度,此為線程安全控件,由于考慮多線的問(wèn)題,需要同步 刷新界面調(diào)用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;
 }
 }
 
 /**
 * 點(diǎn)擊評(píng)分區(qū)域,進(jìn)行評(píng)分
 * 
 * @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 對(duì)外接口,提供當(dāng)前旋轉(zhuǎn)進(jìn)度<br>
 *  1、<br>
 *  2、<br>
 * @author Freedoman
 * @date 2014-10-29
 * @version 1.0
 */
 public interface onProgressChangedListener {
 public void progressChanged(GradeProgressBar circleProgressBar,
 int curProgress);
 }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論