麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > Android > 正文

Android自定義View實現(xiàn)水平帶數(shù)字百分比進(jìn)度條

2019-10-21 21:31:28
字體:
供稿:網(wǎng)友

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

Android,View,進(jìn)度條

思路如下:第一部分是左側(cè)的藍(lán)色直線,代表已經(jīng)完成的進(jìn)度;第二部分是右側(cè)灰色的直線,代表未完成的進(jìn)度;第三部分是紅色的百分比的數(shù)字百分比文本,顯示當(dāng)前確切的完成進(jìn)度。

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

view代碼如下:

public class NumberProgressView extends View {   /**   * 進(jìn)度條畫筆的寬度(dp)   */  private int paintProgressWidth = 3;   /**   * 文字百分比的字體大小(sp)   */  private int paintTextSize = 20;   /**   * 左側(cè)已完成進(jìn)度條的顏色   */  private int paintLeftColor = 0xff67aae4;   /**   * 右側(cè)未完成進(jìn)度條的顏色   */  private int paintRightColor = 0xffaaaaaa;   /**   * 百分比文字的顏色   */  private int paintTextColor = 0xffff0077;   /**   * Contxt   */  private Context context;   /**   * 主線程傳過來進(jìn)程 0 - 100   */  private int progress;   /**   * 得到自定義視圖的寬度   */  private int viewWidth;   /**   * 得到自定義視圖的Y軸中心點(diǎn)   */  private int viewCenterY;   /**   * 畫左邊已完成進(jìn)度條的畫筆   */  private Paint paintleft = new Paint();   /**   * 畫右邊未完成進(jìn)度條的畫筆   */  private Paint paintRight = new Paint();   /**   * 畫中間的百分比文字的畫筆   */  private Paint paintText = new Paint();   /**   * 要畫的文字的寬度   */  private int textWidth;   /**   * 畫文字時底部的坐標(biāo)   */  private float textBottomY;   /**   * 包裹文字的矩形   */  private Rect rect = new Rect();   /**   * 文字總共移動的長度(即從0%到100%文字左側(cè)移動的長度)   */  private int totalMovedLength;   public NumberProgressView(Context context, AttributeSet attrs) {    super(context, attrs);    this.context = context;    // 構(gòu)造器中初始化數(shù)據(jù)    initData();  }   /**   * 初始化數(shù)據(jù)   */  private void initData() {     //設(shè)置進(jìn)度條畫筆的寬度    int paintProgressWidthPx = Utils.dip2px(context, paintProgressWidth);     //設(shè)置百分比文字的尺寸    int paintTextSizePx = Utils.sp2px(context, paintTextSize);     // 已完成進(jìn)度條畫筆的屬性    paintleft.setColor(paintLeftColor);    paintleft.setStrokeWidth(paintProgressWidthPx);    paintleft.setAntiAlias(true);    paintleft.setStyle(Style.FILL);     // 未完成進(jìn)度條畫筆的屬性    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();  }   /**   * 得到視圖等的高度寬度尺寸數(shù)據(jù)   */  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型進(jìn)度    float progressFloat = progress / 100.0f;     //當(dāng)前文字移動的長度    float currentMovedLentgh = totalMovedLength * progressFloat;     //畫左側(cè)已經(jīng)完成的進(jìn)度條,長度為從Veiw左端到文字的左側(cè)    canvas.drawLine(0, viewCenterY, currentMovedLentgh, viewCenterY, paintleft);     //畫右側(cè)未完成的進(jìn)度條,這個進(jìn)度條的長度不是嚴(yán)格按照百分比來縮放的,因為文字的長度會變化,所以它的長度縮放比例也會變化    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);    }     //畫文字(注意:文字要最后畫,因為文字和進(jìn)度條可能會有重合部分,所以要最后畫文字,用文字蓋住重合的部分)    canvas.drawText(progress + "%", currentMovedLentgh, textBottomY, paintText);  }   /**   * @param progress 外部傳進(jìn)來的當(dāng)前進(jìn)度   */  public void setProgress(int progress) {    this.progress = progress;    invalidate();  }}

調(diào)用者activity的代碼,設(shè)置進(jìn)度條的進(jìn)度:

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);  }   /**   * 得到兩個整數(shù)之間的一個隨機(jī)數(shù)   *   * @param start 較小的數(shù)   * @param end  較大的數(shù)   * @return   */  public int getRadomNumber(int start, int end) {    return (int) (start + Math.random() * (end - start));  }}

工具方法:

/**   * 將dip或dp值轉(zhuǎn)換為px值,保證尺寸大小不變   */  public static int dip2px(Context context, float dipValue) {    final float scale = context.getResources().getDisplayMetrics().density;    return (int) (dipValue * scale + 0.5f);  }   /**   * 將sp值轉(zhuǎn)換為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>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 午夜精品福利在线观看 | 日韩欧美激情视频 | 九九色网站 | 免费日本一区二区 | 日韩黄在线 | 免费看黄色一级大片 | 欧美日韩专区国产精品 | 欧美一级高清片在线 | 久久资源总站 | 国外成人在线视频 | 欧美日韩国产一区二区三区在线观看 | 欧美成人小视频 | 色综合狠狠 | 亚洲片在线 | 久久久久久久久久久综合 | 老司机一级毛片 | 看免费一级毛片 | 久久艹逼 | a免费看 | 狠狠干91 | 成人精品久久久 | av成人一区二区 | 欧美18videos性处按摩 | 午夜久久视频 | 欧美精品成人一区二区三区四区 | 色淫网站免费视频 | 日日鲁夜夜视频热线播放 | 久久久久久久久久久影视 | 久久第四色| 91av在线免费观看 | 国产精品午夜未成人免费观看 | 99国产精成人午夜视频一区二区 | 国产成人综合在线观看 | 久久精品国产精品亚洲 | 精品国产一区二区三区四 | 欧美日韩一区,二区,三区,久久精品 | 久久久久久久久91 | 19禁国产精品福利视频 | 毛片视频在线免费观看 | 久草视频手机在线观看 | 欧美日韩高清不卡 |