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

Android實(shí)現(xiàn)帶數(shù)字的圓形進(jìn)度條(自定義進(jìn)度條)

 更新時(shí)間:2017年02月06日 15:33:01   作者:Fun_He  
在項(xiàng)目開發(fā)中經(jīng)常遇到帶圓形進(jìn)度條的需求,在GitHub上逛了一圈,發(fā)現(xiàn)沒有,今天小編抽空給大家分享Android實(shí)現(xiàn)帶數(shù)字的圓形進(jìn)度條(自定義進(jìn)度條),需要的朋友參考下

開發(fā)

設(shè)計(jì)搞了一個(gè)帶圓形進(jìn)度的進(jìn)度條,在GitHub上逛了一圈,發(fā)現(xiàn)沒有,自己擼吧。

先看界面效果:

自定義進(jìn)度條

主要思路是寫一個(gè)繼承ProgressBar的自定義View,不廢話,直接上代碼:

package com.fun.progressbarwithnumber;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ProgressBar;
public class HorizontalProgressBarWithNumber extends ProgressBar {
  private static final int DEFAULT_TEXT_SIZE = 10;
  private static final int DEFAULT_TEXT_COLOR = 0XFFFC00D1;
  private static final int DEFAULT_COLOR_UNREACHED_COLOR = 0xFFd3d6da;
  private static final int DEFAULT_HEIGHT_REACHED_PROGRESS_BAR = 2;
  private static final int DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR = 2;
  private static final int DEFAULT_CIRCLE_COLOR = 0XFF3F51B5;
  protected Paint mPaint = new Paint();
  // 字體顏色
  protected int mTextColor = DEFAULT_TEXT_COLOR;
  // 字體大小
  protected int mTextSize = sp2px(DEFAULT_TEXT_SIZE);
  // 覆蓋進(jìn)度高度
  protected int mReachedProgressBarHeight = dp2px(DEFAULT_HEIGHT_REACHED_PROGRESS_BAR);
  // 覆蓋進(jìn)度顏色
  protected int mReachedBarColor = DEFAULT_TEXT_COLOR;
  // 未覆蓋進(jìn)度高度
  protected int mUnReachedProgressBarHeight = dp2px(DEFAULT_HEIGHT_UNREACHED_PROGRESS_BAR);
  // 未覆蓋進(jìn)度顏色
  protected int mUnReachedBarColor = DEFAULT_COLOR_UNREACHED_COLOR;
  // 圓的顏色
  protected int mCircleColor = DEFAULT_CIRCLE_COLOR;
  protected int mRealWidth;
  protected boolean mIfDrawText = true;
  protected boolean mIfDrawCircle = true;
  protected static final int VISIBLE = 0;
  public HorizontalProgressBarWithNumber(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }
  public HorizontalProgressBarWithNumber(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    obtainStyledAttributes(attrs);
    mPaint.setTextSize(mTextSize);
    mPaint.setColor(mTextColor);
    mPaint.setAntiAlias(true);
  }
  private void obtainStyledAttributes(AttributeSet attrs) {
    // 獲取自定義屬性
    final TypedArray attributes = getContext().obtainStyledAttributes(attrs, R.styleable.HorizontalProgressBarWithNumber);
    mTextColor = attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_text_color, DEFAULT_TEXT_COLOR);
    mTextSize = (int) attributes.getDimension(R.styleable.HorizontalProgressBarWithNumber_progress_text_size, mTextSize);
    mCircleColor = attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_circle_color, DEFAULT_CIRCLE_COLOR);
    mReachedBarColor = attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_reached_color, mTextColor);
    mUnReachedBarColor = attributes.getColor(R.styleable.HorizontalProgressBarWithNumber_progress_unreached_color, DEFAULT_COLOR_UNREACHED_COLOR);
    mReachedProgressBarHeight = (int) attributes.getDimension(R.styleable.HorizontalProgressBarWithNumber_progress_reached_bar_height, mReachedProgressBarHeight);
    mUnReachedProgressBarHeight = (int) attributes.getDimension(R.styleable.HorizontalProgressBarWithNumber_progress_unreached_bar_height, mUnReachedProgressBarHeight);
    int textVisible = attributes.getInt(R.styleable.HorizontalProgressBarWithNumber_progress_text_visibility, VISIBLE);
    if (textVisible != VISIBLE) {
      mIfDrawText = false;
    }
    attributes.recycle();
    int left = (int) (mReachedProgressBarHeight * 0.8), right = (int) (mReachedProgressBarHeight * 0.8);
    int top = (int) (mReachedProgressBarHeight * 0.3 + dp2px(1)), bottom = (int) (mReachedProgressBarHeight * 0.3 + dp2px(1));
    setPadding(left, top, right, bottom);
  }
  @Override
  protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = measureHeight(heightMeasureSpec);
    setMeasuredDimension(width, height);
    mRealWidth = getMeasuredWidth() - getPaddingRight() - getPaddingLeft();
  }
  private int measureHeight(int measureSpec) {
    int result;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);
    if (specMode == MeasureSpec.EXACTLY) {
      result = specSize;
    } else {
      float textHeight = (mPaint.descent() - mPaint.ascent());
      result = (int) (getPaddingTop() + getPaddingBottom() + Math.max(
          Math.max(mReachedProgressBarHeight, mUnReachedProgressBarHeight), Math.abs(textHeight)));
      if (specMode == MeasureSpec.AT_MOST) {
        result = Math.min(result, specSize);
      }
    }
    return result;
  }
  @Override
  protected synchronized void onDraw(Canvas canvas) {
    canvas.save();
    canvas.translate(getPaddingLeft(), getHeight() / 2);
    boolean noNeedBg = false;
    float radio = getProgress() * 1.0f / getMax();
    float progressPosX = (int) (mRealWidth * radio);
    String text = getProgress() + "%";
    float textWidth = mPaint.measureText(text);
    float textHeight = (mPaint.descent() + mPaint.ascent()) / 2;
    float radius = (mReachedProgressBarHeight + getPaddingBottom() + getPaddingTop()) / 2;
    // 覆蓋的進(jìn)度
    float endX = progressPosX;
    if (endX > -1) {
      mPaint.setColor(mReachedBarColor);
      RectF rectF = new RectF(0, 0 - getPaddingTop() - getPaddingBottom(),
          endX, mReachedProgressBarHeight - getPaddingBottom());
      canvas.drawRoundRect(rectF, 25, 25, mPaint);
    }
    // 未覆蓋的進(jìn)度
    if (!noNeedBg) {
      float start = progressPosX;
      mPaint.setColor(mUnReachedBarColor);
      RectF rectF = new RectF(start, 0 - getPaddingTop() - getPaddingBottom(),
          mRealWidth + getPaddingRight() - radius, mReachedProgressBarHeight - getPaddingBottom());
      canvas.drawRoundRect(rectF, 25, 25, mPaint);
    }
    // 圓
    if (mIfDrawCircle) {
      mPaint.setColor(mCircleColor);
      canvas.drawCircle(progressPosX, 0, radius, mPaint);
    }
    // 文本
    if (mIfDrawText) {
      mPaint.setColor(mTextColor);
      canvas.drawText(text, progressPosX - textWidth / 2, -textHeight, mPaint);
    }
    canvas.restore();
  }
  /**
   * dp 2 px
   */
  protected int dp2px(int dpVal) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, getResources().getDisplayMetrics());
  }
  /**
   * sp 2 px
   */
  protected int sp2px(int spVal) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, getResources().getDisplayMetrics());
  }
}

使用

在布局文件中加入:

<com.fun.progressbarwithnumber.HorizontalProgressBarWithNumber
    android:id="@+id/hpbwn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    fun:progress_circle_color="#ff000000"
    fun:progress_reached_bar_height="20dp"
    fun:progress_reached_color="#FFFF4081"
    fun:progress_text_color="#ffffffff"
    fun:progress_text_size="14sp"
    fun:progress_unreached_bar_height="20dp"
    fun:progress_unreached_color="#ffBCB4E8" />

progress_reached_bar_height:當(dāng)前進(jìn)度的高度
progress_unreached_bar_height:剩余進(jìn)度的高度
progress_text_size:圓圈內(nèi)文字的大小

注意:

當(dāng)前進(jìn)度和剩余進(jìn)度的高度要一致,圓圈大小和圓圈內(nèi)文字的大小要配合Java代碼調(diào)整。

項(xiàng)目源碼:

https://github.com/hfrommane/ProgressBarWithNumber

以上所述是小編給大家介紹的Android實(shí)現(xiàn)帶數(shù)字的圓形進(jìn)度條(自定義進(jìn)度條),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 解決webview 第二次調(diào)用loadUrl頁面不刷新的問題

    解決webview 第二次調(diào)用loadUrl頁面不刷新的問題

    這篇文章主要介紹了解決webview 第二次調(diào)用loadUrl頁面不刷新的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 淺談Android開發(fā)系列網(wǎng)絡(luò)篇之Retrofit

    淺談Android開發(fā)系列網(wǎng)絡(luò)篇之Retrofit

    這篇文章主要介紹了淺談Android開發(fā)系列網(wǎng)絡(luò)篇之Retrofit,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • 解決Android軟鍵盤彈出覆蓋h5頁面輸入框問題

    解決Android軟鍵盤彈出覆蓋h5頁面輸入框問題

    之前我們?cè)谑褂胿ue進(jìn)行 h5 表單錄入的過程中,遇到了Android軟鍵盤彈出,覆蓋 h5頁面 輸入框 問題,在此進(jìn)行回顧并分享給大家,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • Android中使用Kotlin實(shí)現(xiàn)一個(gè)簡(jiǎn)單的登錄界面

    Android中使用Kotlin實(shí)現(xiàn)一個(gè)簡(jiǎn)單的登錄界面

    Kotlin 是一種在 Java 虛擬機(jī)上運(yùn)行的靜態(tài)類型編程語言,被稱之為 Android 世界的Swift,由 JetBrains 設(shè)計(jì)開發(fā)并開源。接下來本文通過實(shí)例代碼給大家講解Android中使用Kotlin實(shí)現(xiàn)一個(gè)簡(jiǎn)單的登錄界面,一起看看吧
    2017-09-09
  • Android實(shí)現(xiàn)記住用戶名和密碼功能

    Android實(shí)現(xiàn)記住用戶名和密碼功能

    登陸界面創(chuàng)建一個(gè)復(fù)選按鈕,通過按鈕選取來進(jìn)行事件處理。若按鈕選中記住賬號(hào)和密碼的信息,本文教大家如何使用Android實(shí)現(xiàn)記住用戶名和密碼功能,感興趣的小伙伴們可以參考一下
    2016-05-05
  • android實(shí)現(xiàn)錄屏功能

    android實(shí)現(xiàn)錄屏功能

    這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)錄屏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Android本地存儲(chǔ)SharedPreferences詳解

    Android本地存儲(chǔ)SharedPreferences詳解

    這篇文章主要介紹了Android本地存儲(chǔ)SharedPreferences詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Android Native 內(nèi)存泄漏系統(tǒng)化解決方案

    Android Native 內(nèi)存泄漏系統(tǒng)化解決方案

    這篇文章主要介紹了Android Native 內(nèi)存泄漏系統(tǒng)化解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Android開發(fā)之WebView輸入框提示解決辦法

    Android開發(fā)之WebView輸入框提示解決辦法

    在做webview應(yīng)用時(shí),當(dāng)輸入的文字過多時(shí),輸入的提示箭頭會(huì)移動(dòng)到輸入框外,怎么解決這個(gè)問題呢?下面小編給大家介紹Android開發(fā)之WebView輸入框提示解決辦法,一起看看吧
    2016-06-06
  • Android自定義View實(shí)現(xiàn)餅狀圖帶動(dòng)畫效果

    Android自定義View實(shí)現(xiàn)餅狀圖帶動(dòng)畫效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)餅狀圖帶動(dòng)畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評(píng)論

宜兴市| 崇仁县| 广安市| 凉山| 义乌市| 宁南县| 岫岩| 保定市| 黄山市| 莲花县| 滁州市| 蓬莱市| 盐池县| 郎溪县| 凉山| 广德县| 旅游| 永嘉县| 商水县| 江山市| 莫力| 华池县| 乌鲁木齐市| 通河县| 冷水江市| 江西省| 兰州市| 江北区| 浪卡子县| 灌阳县| 凭祥市| 陆川县| 武乡县| 化德县| 富宁县| 合阳县| 海口市| 普安县| 磴口县| 五指山市| 九江市|