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

Android自定義控件制作顯示進(jìn)度的Button

 更新時(shí)間:2016年08月31日 14:23:50   作者:ly513782705  
這篇文章主要為大家詳細(xì)介紹了Android自定義控件制作顯示進(jìn)度的Button,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最近看到一些應(yīng)用在下載文件的時(shí)候,并沒(méi)有額外彈出進(jìn)度條,而是很炫的使用啟動(dòng)下載任務(wù)的Button直接顯示文件的下載進(jìn)度,通過(guò)改變其背景色,從左向右推進(jìn),直到填滿(mǎn)整個(gè)Button時(shí),意味著下載任務(wù)的完成。

除了這種效果,還看到某酷的視頻客戶(hù)端,在觀看過(guò)的視頻對(duì)應(yīng)的按鈕上,會(huì)給該按鈕添加一個(gè)描邊效果,4條邊,每條邊代表25%的進(jìn)度,由上沿開(kāi)始,順時(shí)針最終到左邊沿,則代表100%的進(jìn)度,這種效果也很不錯(cuò)。

自己也研究了一下,寫(xiě)了個(gè)自定義的button,下面是效果, 

普通的填充效果: 

描邊的效果: 

自定義Button的主要實(shí)現(xiàn)就是繼承Button,并重寫(xiě)onDraw()方法,填充的效果實(shí)現(xiàn)起來(lái)相對(duì)簡(jiǎn)單一點(diǎn):

 if(currentType == TYPE_FILL) {
      mPaint.setColor(getContext().getResources().getColor(R.color.green_yellow));
      mPaint.setAntiAlias(true);
      mPaint.setAlpha(128);
      mPaint.setStrokeWidth(1.0f);
      Rect rect = new Rect();
      //先獲取Button的邊框
      canvas.getClipBounds(rect);
      rect.left += getPaddingLeft();
      //填充條的右邊界根據(jù)當(dāng)前進(jìn)度來(lái)計(jì)算
      rect.top += getPaddingTop();
      rect.right = (rect.left - getPaddingLeft()) + (mProgress * getWidth() / 100) - getPaddingRight();
      rect.bottom -= getPaddingBottom();
      //繪制一個(gè)圓角的長(zhǎng)條,這樣相對(duì)好看一點(diǎn)
      canvas.drawRoundRect(new RectF(rect), 8.0f, 8.0f, mPaint);
    } 
       

描邊效果實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜一點(diǎn),確切說(shuō)是繁瑣:

     else if(currentType == TYPE_STROKE) {
      //初始化畫(huà)筆
      mPaint.setAntiAlias(true);
      mPaint.setColor(getContext().getResources().getColor(R.color.green_yellow));
      mPaint.setAlpha(255);
      //獲取Button的邊框
      Rect rect = new Rect();
      canvas.getClipBounds(rect);
      Paint paint1, paint2, paint3, paint4;
      //根據(jù)當(dāng)前進(jìn)度,確定是繪制哪條邊,其實(shí)也是繪制一個(gè)矩形,只不過(guò)這個(gè)矩形比較扁或是比較窄而已,類(lèi)似一條邊
      if(mProgress >= 0 && mProgress < 25) {
        paint1 = new Paint(mPaint);
        Rect temp = new Rect(rect.left + getPaddingLeft(),
            rect.top + getPaddingTop(),
            rect.left + mProgress * (getWidth() - getPaddingLeft() - getPaddingRight())
                / 25 - getPaddingRight(),
            rect.top + getPaddingTop() + 2);
        canvas.drawRect(temp, paint1);
      } else if(mProgress < 50) {
        paint1 = new Paint(mPaint);
        Rect rect1 = new Rect(rect.left + getPaddingLeft(),
            rect.top + getPaddingTop(), rect.right - getPaddingRight(),
            rect.top + getPaddingTop() + 2);
        canvas.drawRect(rect1, paint1);

        paint2 = new Paint(mPaint);
        Rect rect2 = new Rect(rect.right - getPaddingRight() - 2,
            rect.top + getPaddingTop(), rect.right - getPaddingRight(),
            rect.top + getPaddingTop() + (mProgress - 25) *
                (getHeight() - getPaddingTop() - getPaddingBottom()) / 25);
        canvas.drawRect(rect2, paint2);
      } else if(mProgress < 75) {
        paint1 = new Paint(mPaint);
        Rect rect1 = new Rect(rect.left + getPaddingLeft(),
            rect.top + getPaddingTop(), rect.right - getPaddingRight(),
            rect.top + getPaddingTop() + 2);
        canvas.drawRect(rect1, paint1);

        paint2 = new Paint(mPaint);
        Rect rect2 = new Rect(rect.right - getPaddingRight() - 2,
            rect.top + getPaddingTop(), rect.right - getPaddingRight(),
            rect.bottom - getPaddingBottom());
        canvas.drawRect(rect2, paint2);

        paint3 = new Paint(mPaint);
        Rect rect3 = new Rect(
            rect.right - getPaddingRight() - (mProgress - 50) *
                (getWidth() - getPaddingLeft() - getPaddingRight()) / 25,
            rect.bottom - getPaddingBottom() - 2,
            rect.right - getPaddingRight(),
            rect.bottom - getPaddingBottom());
        canvas.drawRect(rect3, paint3);
      } else if(mProgress <= 100) {
        paint1 = new Paint(mPaint);
        Rect rect1 = new Rect(
            rect.left + getPaddingLeft(),
            rect.top + getPaddingTop(), rect.right - getPaddingRight(),
            rect.top + getPaddingTop() + 2);
        canvas.drawRect(rect1, paint1);

        paint2 = new Paint(mPaint);
        Rect rect2 = new Rect(
            rect.right - getPaddingRight() - 2,
            rect.top + getPaddingTop(), rect.right - getPaddingRight(),
            rect.bottom - getPaddingBottom());
        canvas.drawRect(rect2, paint2);

        paint3 = new Paint(mPaint);
        Rect rect3 = new Rect(
            rect.left + getCompoundPaddingLeft(),
            rect.bottom - getPaddingBottom() - 2, rect.right - getPaddingRight(),
            rect.bottom - getPaddingRight());
        canvas.drawRect(rect3, paint3);

        paint4 = new Paint(mPaint);
        Rect rect4 = new Rect(
            rect.left + getCompoundPaddingLeft(),
            rect.bottom - getPaddingBottom() - (mProgress - 75) *
                (getHeight() - getPaddingTop() - getPaddingBottom()) / 25,
            rect.left + getPaddingLeft() + 2,
            rect.bottom - getPaddingBottom());
        canvas.drawRect(rect4, paint4);
      }
    } 

記得最后執(zhí)行 super.onDraw(canvas);

這樣會(huì)讓填充或是描邊繪制在最底層,不會(huì)擋住Button原有的內(nèi)容。

然后添加一個(gè)API,用于更新進(jìn)度: 

  public void updateProgress(int progress) {
    if(progress >= 0 && progress <= 100) {
      mProgress = progress;
      invalidate();
    } else if(progress < 0) {
      mProgress = 0;
      invalidate();
    } else if(progress > 100) {
      mProgress = 100;
      invalidate();
    }
  } 

Demo的代碼上傳到了github上:https://github.com/YoungLeeForeverBoy/ProgressButton

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

泾阳县| 岳池县| 阿拉尔市| 阜新市| 昌邑市| 阿克陶县| 郸城县| 织金县| 巴里| 大理市| 木兰县| 常宁市| 荣成市| 濮阳市| 张家界市| 天门市| 鸡东县| 阜平县| 教育| 保康县| 胶州市| 乐清市| 抚顺市| 盐津县| 巨鹿县| 淅川县| 高碑店市| 通城县| 页游| 开平市| 葵青区| 日照市| 武胜县| 湟源县| 平度市| 陆良县| 新民市| 乐安县| 共和县| 阿瓦提县| 交口县|