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

首頁 > 系統 > Android > 正文

Android 進度條按鈕ProgressButton的實現代碼

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

有些App在點擊下載按鈕的時候,可以在按鈕上顯示進度,我們可以通過繼承原生Button,重寫onDraw來實現帶進度條的按鈕。

Github:https://github.com/imcloudfloating/ProgressBar

1.效果:

Android,進度條,按鈕,ProgressButton,代碼

2.原理:

創建三個GradientDrawable作為按鈕背景、進度條背景和進度條前景,通過計算進度條的百分比來設置寬度,然后調用invalidate()重繪。GradientDrawable設置顏色、圓角等參數,當然你也可以直接加載xml作為背景。

3.自定義參數:

在values目錄建一個attrs.xml文件

 <?xml version="." encoding="utf-"?> <resources>  <attr name="progressColor" format="color" />  <attr name="progressBackColor" format="color" />  <attr name="progress" format="integer" />  <attr name="minProgress" format="integer" />  <attr name="maxProgress" format="integer" />  <declare-styleable name="ProgressButton">   <attr name="progressColor" />   <attr name="progressBackColor" />   <attr name="buttonColor" format="color" />   <attr name="cornerRadius" format="dimension" />   <attr name="progress" />   <attr name="minProgress" />   <attr name="maxProgress" />   <attr name="progressMargin" format="dimension" />  </declare-styleable> </resources>

3.按鈕類:

在setProgress方法中改變mProgress的值,然后調用invalidate()重繪,因為我這里定義了一個minProgress(默認為0),所以在計算進度條寬度的時候,當前進度和最大進度都要先減去minProgress再做除法。

if (progressWidth < mCornerRadius * 2) { progressWidth = mCornerRadius * 2;}

當進度條寬度小于2倍圓角半徑的時候,進度條的圓角就和背景的圓角不一致,所以加上了上面這段代碼。
獲取寬度和高度其實用getWidth()和getHeight()也可以,只不過在設計器中沒法看到效果,所以我用了getMeasuredWidth()和getMeasuredHeight()。

 package com.cloud.customviews; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.GradientDrawable; import android.support.v.widget.AppCompatButton; import android.util.AttributeSet; public class ProgressButton extends AppCompatButton {  private float mCornerRadius = ;  private float mProgressMargin = ;  private boolean mFinish;  private int mProgress;  private int mMaxProgress = ;  private int mMinProgress = ;  private GradientDrawable mDrawableButton;  private GradientDrawable mDrawableProgressBackground;  private GradientDrawable mDrawableProgress;  public ProgressButton(Context context, AttributeSet attrs) {   super(context, attrs);   initialize(context, attrs);  }  public ProgressButton(Context context, AttributeSet attrs, int defStyle) {   super(context, attrs, defStyle);   initialize(context, attrs);  }  private void initialize(Context context, AttributeSet attrs) {   //Progress background drawable   mDrawableProgressBackground = new GradientDrawable();   //Progress drawable   mDrawableProgress = new GradientDrawable();   //Normal drawable   mDrawableButton = new GradientDrawable();   //Get default normal color   int defaultButtonColor = getResources().getColor(R.color.colorGray, null);   //Get default progress color   int defaultProgressColor = getResources().getColor(R.color.colorGreen, null);   //Get default progress background color   int defaultBackColor = getResources().getColor(R.color.colorGray, null);   TypedArray attr = context.obtainStyledAttributes(attrs, R.styleable.ProgressButton);   try {    mProgressMargin = attr.getDimension(R.styleable.ProgressButton_progressMargin, mProgressMargin);    mCornerRadius = attr.getDimension(R.styleable.ProgressButton_cornerRadius, mCornerRadius);    //Get custom normal color    int buttonColor = attr.getColor(R.styleable.ProgressButton_buttonColor, defaultButtonColor);    //Set normal color    mDrawableButton.setColor(buttonColor);    //Get custom progress background color    int progressBackColor = attr.getColor(R.styleable.ProgressButton_progressBackColor, defaultBackColor);    //Set progress background drawable color    mDrawableProgressBackground.setColor(progressBackColor);    //Get custom progress color    int progressColor = attr.getColor(R.styleable.ProgressButton_progressColor, defaultProgressColor);    //Set progress drawable color    mDrawableProgress.setColor(progressColor);    //Get default progress    mProgress = attr.getInteger(R.styleable.ProgressButton_progress, mProgress);    //Get minimum progress    mMinProgress = attr.getInteger(R.styleable.ProgressButton_minProgress, mMinProgress);    //Get maximize progress    mMaxProgress = attr.getInteger(R.styleable.ProgressButton_maxProgress, mMaxProgress);   } finally {    attr.recycle();   }   //Set corner radius   mDrawableButton.setCornerRadius(mCornerRadius);   mDrawableProgressBackground.setCornerRadius(mCornerRadius);   mDrawableProgress.setCornerRadius(mCornerRadius - mProgressMargin);   setBackgroundDrawable(mDrawableButton);   mFinish = false;  }  @Override  protected void onDraw(Canvas canvas) {   if (mProgress > mMinProgress && mProgress <= mMaxProgress && !mFinish) {    //Calculate the width of progress    float progressWidth =      (float) getMeasuredWidth() * ((float) (mProgress - mMinProgress) / mMaxProgress - mMinProgress);    //If progress width less than x corner radius, the radius of progress will be wrong    if (progressWidth < mCornerRadius * ) {     progressWidth = mCornerRadius * ;    }    //Set rect of progress    mDrawableProgress.setBounds((int) mProgressMargin, (int) mProgressMargin,      (int) (progressWidth - mProgressMargin), getMeasuredHeight() - (int) mProgressMargin);    //Draw progress    mDrawableProgress.draw(canvas);    if (mProgress == mMaxProgress) {     setBackgroundDrawable(mDrawableButton);     mFinish = true;    }   }   super.onDraw(canvas);  }  /**  * Set current progress  */  public void setProgress(int progress) {   if (!mFinish) {    mProgress = progress;    setBackgroundDrawable(mDrawableProgressBackground);    invalidate();   }  }  public void setMaxProgress(int maxProgress) {   mMaxProgress = maxProgress;  }  public void setMinProgress(int minProgress) {   mMinProgress = minProgress;  }  public void reset() {   mFinish = false;   mProgress = mMinProgress;  } }

 使用:

 <com.cloud.customviews.ProgressButton    android:id="@+id/button_progress_green"    android:layout_width="dp"    android:layout_height="wrap_content"    android:layout_marginTop="dp"    android:textAllCaps="false"    android:textColor="@color/colorWhite"    android:text="@string/button_progress"    app:cornerRadius="dp"    app:progressMargin="dp"    app:progressColor="@color/colorGreen"    app:buttonColor="@color/colorGreen" />

總結

以上所述是小編給大家介紹的Android 進度條按鈕ProgressButton的實現代碼,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言小編會及時回復大家的!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 保靖县| 云南省| 中方县| 昭觉县| 嫩江县| 崇义县| 黎平县| 井陉县| 仁化县| 东城区| 永修县| 福鼎市| 永济市| 井冈山市| 庄浪县| 宿州市| 望江县| 宁陵县| 西吉县| 呼和浩特市| 临沭县| 常山县| 枣强县| 府谷县| 永兴县| 灵寿县| 瑞昌市| 宁乡县| 木里| 武夷山市| 澄江县| 巴彦县| 普安县| 汝南县| 梁平县| 南雄市| 凯里市| 博乐市| 长泰县| 万州区| 科技|