亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲一区二区三区| 精品小视频在线| 97超碰国产精品女人人人爽| 亚洲国产美女精品久久久久∴| 91精品国产综合久久香蕉最新版| 蜜月aⅴ免费一区二区三区| 成人黄色av网站| 福利精品视频在线| 亚洲国产精品热久久| 成人在线免费观看视视频| 亚洲免费影视第一页| 最近中文字幕mv在线一区二区三区四区| 亚洲第一区中文99精品| 亚洲人成五月天| 欧美国产高跟鞋裸体秀xxxhd| 国产玖玖精品视频| 日韩福利视频在线观看| 国产欧美日韩中文字幕| 欧美成人精品一区二区三区| 亚洲一区二区中文字幕| 日本欧美精品在线| 成人久久久久久| 国产成人啪精品视频免费网| 久久中文字幕视频| 欧美日韩国产成人在线观看| 欧美最猛性xxxx| 亚洲精品中文字| 欧美激情一区二区三区成人| 亚洲国产小视频在线观看| 久久久久免费精品国产| 在线视频一区二区| 国产精品亚洲网站| 欧美性xxxx极品hd满灌| 亚洲精品小视频| 久久频这里精品99香蕉| 亚洲电影av在线| 亚洲伊人成综合成人网| 欧美另类老肥妇| 国产成人精彩在线视频九色| 亚洲精品中文字幕女同| 亚洲无线码在线一区观看| 国产热re99久久6国产精品| 国产一区二区三区在线免费观看| 欧美做受高潮电影o| 亚洲摸下面视频| 成人性教育视频在线观看| 91精品视频免费看| 欧美一级bbbbb性bbbb喷潮片| 欧美中文字幕在线观看| 欧美激情伊人电影| 久久免费视频在线观看| 亚洲色在线视频| 久久综合免费视频影院| 亚洲999一在线观看www| 欧美丰满少妇xxxxx| 欧美电影《睫毛膏》| 日韩欧美aⅴ综合网站发布| 欧美在线视频观看免费网站| 国内精品国产三级国产在线专| 欧美性猛交xxxx免费看| 国产精品九九九| 91久久久久久久久久久| 高清一区二区三区日本久| 欧美视频中文在线看| 国产欧美亚洲精品| 高清一区二区三区日本久| 欧美日韩激情视频8区| 91麻豆国产语对白在线观看| 日韩av在线直播| 欧美国产第二页| 成人黄色影片在线| 亚洲人成网在线播放| 亚洲国产精品资源| 九九精品在线观看| 亚洲free性xxxx护士hd| 欧美人在线观看| 精品亚洲男同gayvideo网站| 国产亚洲精品综合一区91| 日韩中文av在线| 亚洲成年人在线播放| 国产啪精品视频| 亚洲精品在线不卡| 欧美天天综合色影久久精品| 日韩精品亚洲精品| 2019中文字幕在线免费观看| 尤物yw午夜国产精品视频明星| 国产美女高潮久久白浆| 久久久女女女女999久久| 国产精彩精品视频| 久久伊人精品视频| 91视频九色网站| 国产精品成熟老女人| 欧美国产精品日韩| 日韩精品免费在线观看| 91久久精品国产91久久| 精品国产一区二区三区久久久狼| 久久免费视频在线观看| 亚洲欧美制服综合另类| 中文字幕亚洲综合久久筱田步美| 日韩中文字幕国产| 国产精品爱久久久久久久| 亚洲一区二区三区视频| 色老头一区二区三区| 国产精品第一区| 亚洲性猛交xxxxwww| 91丨九色丨国产在线| 色综合久综合久久综合久鬼88| 欧美激情视频在线| 国模私拍一区二区三区| 国产一区二区黑人欧美xxxx| 国产精品久久77777| 亚洲的天堂在线中文字幕| 日韩经典一区二区三区| 日韩在线观看免费全集电视剧网站| 欧美在线xxx| 亚洲香蕉成人av网站在线观看| 超碰精品一区二区三区乱码| 精品性高朝久久久久久久| 国产成人精彩在线视频九色| 国产精品视频公开费视频| 欧美一二三视频| 欧美亚洲视频一区二区| 精品日本美女福利在线观看| 亚洲一品av免费观看| 国产精品福利在线观看网址| 欧美大片免费观看在线观看网站推荐| 国产日本欧美一区二区三区在线| 九九热r在线视频精品| 日韩成人在线观看| 亚洲成人黄色网| 日韩免费观看在线观看| 欧美日韩成人精品| 亚洲天堂av在线播放| 欧美大成色www永久网站婷| 久久久久久综合网天天| 国产精品日韩欧美综合| 国产亚洲aⅴaaaaaa毛片| 成人av在线天堂| 亚洲第一精品自拍| 亚洲国产天堂久久综合网| 欧美激情第一页xxx| 91精品免费看| 国产69精品久久久| 亚洲www在线| 免费不卡欧美自拍视频| 97精品在线视频| 精品性高朝久久久久久久| 欧美大片大片在线播放| 欧美性高跟鞋xxxxhd| 日韩成人在线网站| 国产有码一区二区| 久久国内精品一国内精品| 欧美国产日产韩国视频| 亚洲精品中文字幕有码专区| 国产精品专区h在线观看| 欧美大全免费观看电视剧大泉洋| 欧美另类极品videosbestfree| 国产精品揄拍500视频| 亚洲久久久久久久久久久| 青草青草久热精品视频在线网站| 91情侣偷在线精品国产| 欧美另类老女人| 深夜福利亚洲导航| 精品少妇一区二区30p|