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

首頁 > 系統 > Android > 正文

Android自定義View實現水平帶數字百分比進度條

2019-10-21 21:31:28
字體:
來源:轉載
供稿:網友

這個進度條可以反映真實進度,并且完成百分比的文字時隨著進度增加而移動的,所在位置也恰好是真實完成的百分比位置,效果如下:

Android,View,進度條

思路如下:第一部分是左側的藍色直線,代表已經完成的進度;第二部分是右側灰色的直線,代表未完成的進度;第三部分是紅色的百分比的數字百分比文本,顯示當前確切的完成進度。

最關鍵的部分就是要確定百分比文本的確切位置,這里用了paint的getTextBounds方法,得到文本的寬高,然后再精確確定它的位置。

view代碼如下:

public class NumberProgressView extends View {   /**   * 進度條畫筆的寬度(dp)   */  private int paintProgressWidth = 3;   /**   * 文字百分比的字體大?。╯p)   */  private int paintTextSize = 20;   /**   * 左側已完成進度條的顏色   */  private int paintLeftColor = 0xff67aae4;   /**   * 右側未完成進度條的顏色   */  private int paintRightColor = 0xffaaaaaa;   /**   * 百分比文字的顏色   */  private int paintTextColor = 0xffff0077;   /**   * Contxt   */  private Context context;   /**   * 主線程傳過來進程 0 - 100   */  private int progress;   /**   * 得到自定義視圖的寬度   */  private int viewWidth;   /**   * 得到自定義視圖的Y軸中心點   */  private int viewCenterY;   /**   * 畫左邊已完成進度條的畫筆   */  private Paint paintleft = new Paint();   /**   * 畫右邊未完成進度條的畫筆   */  private Paint paintRight = new Paint();   /**   * 畫中間的百分比文字的畫筆   */  private Paint paintText = new Paint();   /**   * 要畫的文字的寬度   */  private int textWidth;   /**   * 畫文字時底部的坐標   */  private float textBottomY;   /**   * 包裹文字的矩形   */  private Rect rect = new Rect();   /**   * 文字總共移動的長度(即從0%到100%文字左側移動的長度)   */  private int totalMovedLength;   public NumberProgressView(Context context, AttributeSet attrs) {    super(context, attrs);    this.context = context;    // 構造器中初始化數據    initData();  }   /**   * 初始化數據   */  private void initData() {     //設置進度條畫筆的寬度    int paintProgressWidthPx = Utils.dip2px(context, paintProgressWidth);     //設置百分比文字的尺寸    int paintTextSizePx = Utils.sp2px(context, paintTextSize);     // 已完成進度條畫筆的屬性    paintleft.setColor(paintLeftColor);    paintleft.setStrokeWidth(paintProgressWidthPx);    paintleft.setAntiAlias(true);    paintleft.setStyle(Style.FILL);     // 未完成進度條畫筆的屬性    paintRight.setColor(paintRightColor);    paintRight.setStrokeWidth(paintProgressWidthPx);    paintRight.setAntiAlias(true);    paintRight.setStyle(Style.FILL);     // 百分比文字畫筆的屬性    paintText.setColor(paintTextColor);    paintText.setTextSize(paintTextSizePx);    paintText.setAntiAlias(true);    paintText.setTypeface(Typeface.DEFAULT_BOLD);   }   @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    getWidthAndHeight();  }   /**   * 得到視圖等的高度寬度尺寸數據   */  private void getWidthAndHeight() {     //得到包圍文字的矩形的寬高    paintText.getTextBounds("000%", 0, "000%".length(), rect);    textWidth = rect.width();    textBottomY = viewCenterY + rect.height() / 2;     //得到自定義視圖的高度    int viewHeight = getMeasuredHeight();    viewWidth = getMeasuredWidth();    viewCenterY = viewHeight / 2;    totalMovedLength = viewWidth - textWidth;   }   @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);     //得到float型進度    float progressFloat = progress / 100.0f;     //當前文字移動的長度    float currentMovedLentgh = totalMovedLength * progressFloat;     //畫左側已經完成的進度條,長度為從Veiw左端到文字的左側    canvas.drawLine(0, viewCenterY, currentMovedLentgh, viewCenterY, paintleft);     //畫右側未完成的進度條,這個進度條的長度不是嚴格按照百分比來縮放的,因為文字的長度會變化,所以它的長度縮放比例也會變化    if (progress < 10) {      canvas.drawLine(currentMovedLentgh + textWidth * 0.5f, viewCenterY, viewWidth, viewCenterY, paintRight);    } else if (progress < 100) {      canvas.drawLine(currentMovedLentgh + textWidth * 0.75f, viewCenterY, viewWidth, viewCenterY, paintRight);    } else {      canvas.drawLine(currentMovedLentgh + textWidth, viewCenterY, viewWidth, viewCenterY, paintRight);    }     //畫文字(注意:文字要最后畫,因為文字和進度條可能會有重合部分,所以要最后畫文字,用文字蓋住重合的部分)    canvas.drawText(progress + "%", currentMovedLentgh, textBottomY, paintText);  }   /**   * @param progress 外部傳進來的當前進度   */  public void setProgress(int progress) {    this.progress = progress;    invalidate();  }}

調用者activity的代碼,設置進度條的進度:

public class NumberProgressBarActivity extends Activity {   protected static final int WHAT_INCREASE = 1;  private NumberProgressView np_numberProgressBar;  private int progress;   private Handler handler = new Handler() {    public void handleMessage(android.os.Message msg) {      progress++;      np_numberProgressBar.setProgress(progress);      handler.sendEmptyMessageDelayed(WHAT_INCREASE, getRadomNumber(50, 200));      if (progress >= 100) {        handler.removeMessages(WHAT_INCREASE);      }    }  };   @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_number_progress_bar);    np_numberProgressBar = (NumberProgressView) findViewById(R.id.np_numberProgressBar);    Button btn_numberProgressBar = (Button) findViewById(R.id.btn_numberProgressBar);    btn_numberProgressBar.setOnClickListener(new OnClickListener() {      @Override      public void onClick(View v) {        increase();      }    });  }   private void increase() {    progress = 0;    np_numberProgressBar.setProgress(0);    handler.removeMessages(WHAT_INCREASE);    handler.sendEmptyMessage(WHAT_INCREASE);  }   /**   * 得到兩個整數之間的一個隨機數   *   * @param start 較小的數   * @param end  較大的數   * @return   */  public int getRadomNumber(int start, int end) {    return (int) (start + Math.random() * (end - start));  }}

工具方法:

/**   * 將dip或dp值轉換為px值,保證尺寸大小不變   */  public static int dip2px(Context context, float dipValue) {    final float scale = context.getResources().getDisplayMetrics().density;    return (int) (dipValue * scale + 0.5f);  }   /**   * 將sp值轉換為px值,保證文字大小不變   */  public static int sp2px(Context context, float spValue) {    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;    return (int) (spValue * fontScale + 0.5f);  }

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"       android:layout_width="match_parent"       android:layout_height="match_parent"       android:orientation="vertical">   <com.example.viewdemo.view.NumberProgressView    android:id="@+id/np_numberProgressBar"    android:layout_width="wrap_content"    android:layout_height="100dp"    android:layout_margin="20dp"    android:background="#33890075"    />   <Button    android:id="@+id/btn_numberProgressBar"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="開始"/> </LinearLayout>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019好看的中文字幕免费| 久久精品视频中文字幕| 亚洲精品在线观看www| 久久视频在线视频| 韩国三级日本三级少妇99| 亚洲天堂一区二区三区| 亚洲欧洲国产伦综合| 97在线精品视频| 欧美日韩在线看| 亚洲天堂网站在线观看视频| 91大神福利视频在线| 国产69精品99久久久久久宅男| 亚洲精品短视频| 日韩视频免费在线观看| 国产三级精品网站| 国产精品久久久久久久一区探花| 亚洲自拍高清视频网站| 亚洲福利视频在线| 国产成人精品优优av| 一区二区三区视频免费| 国产精品久久久久久网站| 国产欧美精品一区二区| 日韩禁在线播放| 欧美日韩激情美女| 欧美性xxxx在线播放| 久久久人成影片一区二区三区观看| 欧美日韩一区二区在线播放| 色狠狠av一区二区三区香蕉蜜桃| 欧美疯狂xxxx大交乱88av| 91沈先生作品| 狠狠躁夜夜躁人人爽天天天天97| 狠狠色噜噜狠狠狠狠97| 亚洲欧洲偷拍精品| 一区二区成人精品| 国产精品日韩在线一区| 久久久久久久一| 九九精品视频在线| 亚洲综合一区二区不卡| 亚洲第一男人av| 亚洲另类xxxx| 成人女保姆的销魂服务| 久久久亚洲国产| 亚洲男人天堂网站| 久久99视频免费| 亚洲欧美日韩国产成人| 欧美日韩国产成人在线| 亚洲欧美国产精品专区久久| 九九精品视频在线观看| 欧美性极品少妇精品网站| 国产精品老牛影院在线观看| 国产精品毛片a∨一区二区三区|国| 成人中心免费视频| 久久成人人人人精品欧| 欧美在线性视频| 91免费综合在线| 色狠狠av一区二区三区香蕉蜜桃| 久久久久国色av免费观看性色| 高清欧美性猛交xxxx黑人猛交| 亚洲人成网站色ww在线| 亚洲欧美在线一区| www.色综合| 97精品欧美一区二区三区| 久久av中文字幕| 欧美激情精品久久久久久蜜臀| 国产精品美女无圣光视频| 欧美韩国理论所午夜片917电影| 国产亚洲欧美另类中文| 久久久www成人免费精品张筱雨| 久久人91精品久久久久久不卡| 亚洲国产精品va在线| 久久久精品久久久久| 欧美精品电影在线| 国产精品福利网站| 91久久久精品| 日本三级久久久| 国产一区视频在线播放| 国产亚洲精品美女久久久久| 久久久精品在线观看| 国产日韩精品综合网站| 日本亚洲欧洲色| 国产成人精品a视频一区www| 国产精品入口免费视| 亚洲aa中文字幕| 黄色精品在线看| 福利微拍一区二区| 日韩精品视频观看| 亚洲字幕一区二区| 日韩欧美一区视频| 色综合久久中文字幕综合网小说| 亚洲男女自偷自拍图片另类| 中文字幕亚洲欧美| 国产69精品99久久久久久宅男| 欧美一区二区三区图| 亚洲国产99精品国自产| 不卡av在线播放| 在线国产精品视频| 亚洲已满18点击进入在线看片| 久久精品视频在线观看| 亚洲男子天堂网| 亚洲在线观看视频网站| 精品视频久久久久久久| 欧美一级免费看| 久久伊人91精品综合网站| 精品在线小视频| 成人免费淫片aa视频免费| 青草热久免费精品视频| 欧美日韩国产中文精品字幕自在自线| 影音先锋欧美精品| 成人在线中文字幕| 一本一本久久a久久精品综合小说| 亚洲国产精品中文| 91九色国产视频| 不卡av电影在线观看| 最近2019中文免费高清视频观看www99| 欧美日韩亚洲精品内裤| 国产精品电影一区| 久久国产精品电影| 久久久精品国产网站| 欧美成人一区在线| 日韩欧美在线播放| 亚洲高清av在线| 国产一区欧美二区三区| 精品在线观看国产| 国产精品电影久久久久电影网| 在线成人免费网站| 亚洲精品一区中文| 色先锋久久影院av| 亚洲成人激情图| 亚洲v日韩v综合v精品v| 国产精品免费看久久久香蕉| 91影视免费在线观看| 亚洲天堂免费在线| 久久免费精品日本久久中文字幕| 亚洲乱码一区二区| 久久69精品久久久久久久电影好| 国产精品久久久久久久久久久久| 亚洲欧美日韩精品久久| 亚洲欧美日韩网| 亚洲第一视频网| 日韩亚洲国产中文字幕| 国产成人欧美在线观看| 欧美激情一区二区三区在线视频观看| 成人午夜在线影院| 亚洲美女喷白浆| 欧美国产日产韩国视频| 粉嫩av一区二区三区免费野| 欧美成人激情视频免费观看| 国产精品三级网站| 午夜剧场成人观在线视频免费观看| 欧美在线欧美在线| 91成人免费观看网站| 美女撒尿一区二区三区| 成人精品在线观看| 日韩激情av在线播放| 日韩网站免费观看高清| 77777少妇光屁股久久一区| 欧美日在线观看| 国产91免费观看| 亚洲国产精品网站| 欧美成人合集magnet| 久久久久久97| 亚洲人成在线观看网站高清| 性金发美女69hd大尺寸| 亚洲成人网久久久|