最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 實現(xiàn)自定義圓形進度條的功能

 更新時間:2016年11月15日 17:16:27   作者:騎著海去看蝸牛  
這篇文章主要介紹了Android 實現(xiàn)自定義圓形進度條的功能的相關資料,開發(fā)Android應用的朋友肯定對自定義View不陌生,很多都有重新寫的,這里就對實現(xiàn)圓形進度條介紹下,需要的朋友可以參考下

Android 實現(xiàn)自定義圓形進度條:

                Android 自定義view,在大多數(shù)項目中根據(jù)客戶需求及用戶的體驗度來說,都要重新寫控件的來展示漂亮的界面,這里就對圓形進度條說下如何實現(xiàn)。

繪制自定義的圓形進度條,分為三個步驟,內圓、外圓、文字。

其中內圓和文字比較好繪制,進度條的變化是由外圓來控制的,所以核心就是繪制外圓。

首先定義分別定義這三個畫筆,兩個Paint和一個TextPaint

mCirclePaint = new Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setStrokeWidth(CIRCLE_LINE_WIDTH);
mCirclePaint.setStyle(Paint.Style.STROKE);
mCirclePaint.setColor(ContextCompat.getColor(context, R.color.circle_color));

mCircleInnerPaint = new Paint();
mCircleInnerPaint.setAntiAlias(true);
mCircleInnerPaint.setStyle(Paint.Style.FILL);
mCircleInnerPaint.setColor(ContextCompat.getColor(context, R.color.circle_inner_color));

mTextPaint = new TextPaint();
mTextPaint.setAntiAlias(true);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
mTextPaint.setColor(ContextCompat.getColor(context, R.color.circle_text_color));
mTextPaint.setTextSize(TEXT_SIZE);

然后讓我們分別繪制出這三個部分獲取自定義View的寬和高

float halfWidth = getMeasuredWidth() / 2;
float halfHeight = getMeasuredHeight() / 2;

繪制外圓

canvas.drawCircle(halfWidth, halfHeight, CIRCLE_RADIUS,mCirclePaint);

繪制內圓

canvas.drawCircle(halfWidth, halfHeight,CIRCLE_RADIUS - CIRCLE_LINE_WIDTH / 2,mCircleInnerPaint);

繪制文字

canvas.drawText(mProgressText,halfWidth - mTextPaint.measureText(mProgressText) / 2,halfHeight - (mTextPaint.ascent() + mTextPaint.descent()) / 2,mTextPaint);

最后的效果如下圖


繪制完了基本的圖案,下一步就是實現(xiàn)進度條的動畫效果

進度條是實時變化的,所以需要不斷的去更新進度,進度可以用圓弧開繪制

設置進度的方法

public void setProgress(float progress) {
 if (progress > 100) {
  progress = 100;
 }
 if (progress < 0) {
  progress = 0;
 }
 mProgress = progress;
 mProgressText = "Pause";
 mStartProgress = true;
 postInvalidate();
}

在Activity中開一個線程模擬網(wǎng)絡請求后更新進度條的操作

沒30毫秒更新一次數(shù)據(jù),當進度超過100,停止刷新界面

private void startProgress() {
 new Thread() {
 @Override
 public void run() {
  super.run();
  float currentProgress = mCustomView.getCurrentProgress();
  ++currentProgress;
  mCustomView.setProgress(currentProgress);
  try {
   sleep(30);
   if (currentProgress <= 100) {
    startProgress();
   } else {
    mCustomView.progressFinished();
   }
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
 }
 }.start();
}

最核心的部分,進度更新后更新繪制圓形進度條

float halfWidth = getMeasuredWidth() / 2;
float halfHeight = getMeasuredHeight() / 2;
if (null == mCircleRectF) {
  mCircleRectF = new RectF(halfWidth - CIRCLE_RADIUS, halfHeight - CIRCLE_RADIUS,      halfWidth + CIRCLE_RADIUS, halfHeight + CIRCLE_RADIUS);
}
if (mStartProgress) {
  float swipeProgress = mProgress / 100f * 360;
  LogUtils.e("swipeProgress = " + swipeProgress);
  canvas.drawArc(mCircleRectF, -90, swipeProgress, true, mCirclePaint);
} else {
  canvas.drawCircle(halfWidth, halfHeight, CIRCLE_RADIUS,mCirclePaint);
}

繪制的思路就是把progress進度轉換為圓弧的弧度,然后不斷繪制出來,這里要注意,從-90開始,也就是時鐘的0點時刻開始繪制。如果進度已經繪制完成,或者還沒有開始,則直接繪制一個圓形。

大概思路就是這樣,最后上兩張效果圖



如果有什么更好的實現(xiàn)思路,可以一起討論學習。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

最新評論

星座| 洪洞县| 洛川县| 姚安县| 城步| 禄丰县| 封开县| 久治县| 张家川| 长武县| 霍林郭勒市| 大余县| 蛟河市| 祥云县| 扶绥县| 衡东县| 鄂托克前旗| 青海省| 峡江县| 黎川县| 仲巴县| 巴南区| 宜昌市| 留坝县| 上虞市| 巴里| 西乡县| 行唐县| 湾仔区| 建水县| 安顺市| 双城市| 游戏| 磐安县| 宕昌县| 那坡县| 宜丰县| 祥云县| 肇源县| 涞水县| 石门县|