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

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

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

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

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

繪制自定義的圓形進(jìn)度條,分為三個(gè)步驟,內(nèi)圓、外圓、文字。

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

首先定義分別定義這三個(gè)畫筆,兩個(gè)Paint和一個(gè)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);

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

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

繪制外圓

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

繪制內(nèi)圓

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);

最后的效果如下圖


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

進(jìn)度條是實(shí)時(shí)變化的,所以需要不斷的去更新進(jìn)度,進(jìn)度可以用圓弧開繪制

設(shè)置進(jìn)度的方法

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

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

沒30毫秒更新一次數(shù)據(jù),當(dāng)進(jìn)度超過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();
}

最核心的部分,進(jìn)度更新后更新繪制圓形進(jìn)度條

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進(jìn)度轉(zhuǎn)換為圓弧的弧度,然后不斷繪制出來,這里要注意,從-90開始,也就是時(shí)鐘的0點(diǎn)時(shí)刻開始繪制。如果進(jìn)度已經(jīng)繪制完成,或者還沒有開始,則直接繪制一個(gè)圓形。

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



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

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

相關(guān)文章

  • Android  TextView中部分文字高亮顯示

    Android TextView中部分文字高亮顯示

    這篇文章主要介紹了Android TextView中部分文字高亮顯示的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Android?JetPack組件的支持庫Databinding詳解

    Android?JetPack組件的支持庫Databinding詳解

    DataBinding是Google發(fā)布的一個(gè)數(shù)據(jù)綁定框架,它能夠讓開發(fā)者減少重復(fù)性非常高的代碼,如findViewById這樣的操作。其核心優(yōu)勢是解決了數(shù)據(jù)分解映射到各個(gè)view的問題,在MVVM框架中,實(shí)現(xiàn)的View和Viewmode的雙向數(shù)據(jù)綁定
    2022-08-08
  • 淺談Android中適配器的notifyDataSetChanged()為何有時(shí)不刷新

    淺談Android中適配器的notifyDataSetChanged()為何有時(shí)不刷新

    這篇文章主要介紹了淺談Android中適配器的notifyDataSetChanged()為何有時(shí)不刷新,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Android應(yīng)用APP自動(dòng)更新功能的代碼實(shí)現(xiàn)

    Android應(yīng)用APP自動(dòng)更新功能的代碼實(shí)現(xiàn)

    本篇文章主要介紹了Android應(yīng)用APP自動(dòng)更新功能的代碼實(shí)現(xiàn),想要實(shí)現(xiàn)這個(gè)效果的同學(xué)可以了解一下。
    2016-11-11
  • Retrofit之OKHttpCall源碼分析

    Retrofit之OKHttpCall源碼分析

    這篇文章主要介紹了Retrofit之OKHttpCall源碼分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Android通過SeekBar調(diào)節(jié)布局背景顏色

    Android通過SeekBar調(diào)節(jié)布局背景顏色

    這篇文章主要為大家詳細(xì)介紹了Android通過SeekBar調(diào)節(jié)布局背景顏色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android植物大戰(zhàn)僵尸小游戲

    Android植物大戰(zhàn)僵尸小游戲

    植物大戰(zhàn)僵尸小游戲,無論老少皆愛,非常有意思,具有挑戰(zhàn)性,那么基于代碼是怎么實(shí)現(xiàn)的呢?下面通過本文給大家介紹Android植物大戰(zhàn)僵尸小游戲,感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • Android Popwindow彈出框的模板使用示例

    Android Popwindow彈出框的模板使用示例

    這篇文章給大家介紹了Android Popwindow彈出框的模板使用示例,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-06-06
  • Android10自動(dòng)連接WiFi問題的解決

    Android10自動(dòng)連接WiFi問題的解決

    這篇文章主要介紹了Android10自動(dòng)連接WiFi問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Android懸浮按鈕的使用方法

    Android懸浮按鈕的使用方法

    這篇文章主要為大家詳細(xì)介紹了Android懸浮按鈕的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評論