国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android實現環形進度條

2019-10-21 21:47:47
字體:
來源:轉載
供稿:網友

一個通俗易懂的環形進度條,可以定制顏色角度,監聽進度。

Android,環形進度條

定義一個attrs.xml

<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="CircleProgressView">  <!--畫筆寬度-->  <attr name="progress_width" format="dimension" />  <!--畫筆顏色-->  <attr name="progress_color" format="color" />  <!--加載進度起始位置-->  <attr name="location_start" format="enum">   <enum name="left" value="1" />   <enum name="top" value="2" />   <enum name="right" value="3" />   <enum name="bottom" value="4" />  </attr> </declare-styleable></resources>

自定義CircleProgressView

package com.sample.circleprogressview.widget;import android.animation.ValueAnimator;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.support.annotation.Nullable;import android.util.AttributeSet;import android.view.View;import android.view.animation.LinearInterpolator;import com.sample.circleprogressview.R;/** * 普通環形進度條 */public class CircleProgressView extends View { private int mCurrent;//當前進度 private Paint mBgPaint;//背景弧線paint private Paint mProgressPaint;//進度Paint private float mProgressWidth;//進度條寬度 private int mProgressColor = Color.RED;//進度條顏色 private int locationStart;//起始位置 private float startAngle;//開始角度 private ValueAnimator mAnimator; public CircleProgressView(Context context) {  this(context, null); } public CircleProgressView(Context context, @Nullable AttributeSet attrs) {  this(context, attrs, 0); } public CircleProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {  super(context, attrs, defStyleAttr);  init(context, attrs); } private void init(Context context, AttributeSet attrs) {  TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressView);  locationStart = typedArray.getInt(R.styleable.CircleProgressView_location_start, 1);  mProgressWidth = typedArray.getDimension(R.styleable.CircleProgressView_progress_width, dp2px(context, 4));  mProgressColor = typedArray.getColor(R.styleable.CircleProgressView_progress_color, mProgressColor);  typedArray.recycle();  //背景圓弧  mBgPaint = new Paint();  mBgPaint.setAntiAlias(true);  mBgPaint.setStrokeWidth(mProgressWidth);  mBgPaint.setStyle(Paint.Style.STROKE);  mBgPaint.setColor(Color.parseColor("#eaecf0"));  mBgPaint.setStrokeCap(Paint.Cap.ROUND);  //進度圓弧  mProgressPaint = new Paint();  mProgressPaint.setAntiAlias(true);  mProgressPaint.setStyle(Paint.Style.STROKE);  mProgressPaint.setStrokeWidth(mProgressWidth);  mProgressPaint.setColor(mProgressColor);  mProgressPaint.setStrokeCap(Paint.Cap.ROUND);  //進度條起始角度  if (locationStart == 1) {//左   startAngle = -180;  } else if (locationStart == 2) {//上   startAngle = -90;  } else if (locationStart == 3) {//右   startAngle = 0;  } else if (locationStart == 4) {//下   startAngle = 90;  } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  int width = MeasureSpec.getSize(widthMeasureSpec);  int height = MeasureSpec.getSize(heightMeasureSpec);  int size = width < height ? width : height;  setMeasuredDimension(size, size); } /**  * oval // 繪制范圍  * startAngle // 開始角度  * sweepAngle // 掃過角度  * useCenter // 是否使用中心  */ @Override protected void onDraw(Canvas canvas) {  //繪制背景圓弧  RectF rectF = new RectF(mProgressWidth / 2, mProgressWidth / 2, getWidth() - mProgressWidth / 2, getHeight() - mProgressWidth / 2);  canvas.drawArc(rectF, 0, 360, false, mBgPaint);  //繪制當前進度  float sweepAngle = 360 * mCurrent / 100;  canvas.drawArc(rectF, startAngle, sweepAngle, false, mProgressPaint); } public int getCurrent() {  return mCurrent; } /**  * 設置進度  *  * @param current  */ public void setCurrent(int current) {  mCurrent = current;  invalidate(); } private int tCurrent = -1; /**  * 動畫效果  *  * @param current 精度條進度:0-100  * @param duration 動畫時間  */ public void startAnimProgress(int current, int duration) {  mAnimator = ValueAnimator.ofInt(0, current);  mAnimator.setDuration(duration);  mAnimator.setInterpolator(new LinearInterpolator());  mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {   @Override   public void onAnimationUpdate(ValueAnimator animation) {    int current = (int) animation.getAnimatedValue();    if (tCurrent != current) {     tCurrent = current;     setCurrent(current);     if (mOnAnimProgressListener != null)      mOnAnimProgressListener.valueUpdate(current);    }   }  });  mAnimator.start(); } public interface OnAnimProgressListener {  void valueUpdate(int progress); } private OnAnimProgressListener mOnAnimProgressListener; /**  * 監聽進度條進度  *  * @param onAnimProgressListener  */ public void setOnAnimProgressListener(OnAnimProgressListener onAnimProgressListener) {  mOnAnimProgressListener = onAnimProgressListener; } public void destroy() {  if (mAnimator != null) {   mAnimator.cancel();  } } public static int dp2px(Context context, float dpValue) {  final float scale = context.getResources().getDisplayMetrics().density;  return (int) (dpValue * scale + 0.5f); }}

代碼就這么些,接下來我們測算一下

package com.sample.circleprogressview;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import com.sample.circleprogressview.widget.CircleProgressView;public class MainActivity extends AppCompatActivity implements View.OnClickListener { private CircleProgressView circle_progress; private TextView tv_progress; private Button btn_start; private Button btn_reset; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  btn_start = (Button) findViewById(R.id.btn_start);  btn_reset = (Button) findViewById(R.id.btn_reset);  circle_progress = (CircleProgressView) findViewById(R.id.circle_progress);  tv_progress = (TextView) findViewById(R.id.tv_progress);  btn_start.setOnClickListener(this);  btn_reset.setOnClickListener(this); } @Override public void onClick(View v) {  switch (v.getId()) {   case R.id.btn_start:    //開鎖執行動畫效果    circle_progress.startAnimProgress(50, 1200);    //監聽進度條進度    circle_progress.setOnAnimProgressListener(new CircleProgressView.OnAnimProgressListener() {     @Override     public void valueUpdate(int progress) {      tv_progress.setText(String.valueOf(progress));     }    });    break;   case R.id.btn_reset:    circle_progress.setCurrent(0);    tv_progress.setText("0");    break;  } } @Override protected void onDestroy() {  super.onDestroy();  if (circle_progress != null) {   circle_progress.destroy();  } }}

源碼:下載地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 剑阁县| 松溪县| 广平县| 静安区| 冀州市| 衡阳市| 额敏县| 双城市| 丰顺县| 鄱阳县| 怀化市| 仙游县| 金沙县| 漳平市| 黄石市| 饶平县| 增城市| 阿勒泰市| 合肥市| 揭阳市| 桂阳县| 兴业县| 洪湖市| 景德镇市| 淮安市| 都兰县| 安宁市| 绵阳市| 光泽县| 健康| 和田市| 云和县| 东方市| 高邑县| 上思县| 随州市| 平舆县| 肇州县| 沭阳县| 永安市| 长阳|