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

首頁 > 系統 > Android > 正文

Android中自定義進度條詳解

2020-04-11 11:41:13
字體:
來源:轉載
供稿:網友

Android原生控件只有橫向進度條一種,而且沒法變換樣式,比如原生rom的樣子

很丑是吧,當偉大的產品設計要求更換前背景,甚至縱向,甚至圓弧狀的,咋辦,比如:

ok,我們開始吧:

一)變換前背景

先來看看progressbar的屬性:

復制代碼 代碼如下:

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dip"
            android:layout_toRightOf="@+id/progressBarV"
            android:indeterminate="false"
            android:padding="2dip"
            android:progress="50" />

根據style="?android:attr/progressBarStyleHorizontal",我們找到源碼中的style.xml

復制代碼 代碼如下:

<style name="Widget.ProgressBar.Horizontal">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
        <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
        <item name="android:minHeight">20dip</item>
        <item name="android:maxHeight">20dip</item>
    </style>

看到:

復制代碼 代碼如下:

<item name="android:progressDrawable">@android:drawable/progress_horizontal</item>

木有,繼續發掘源碼,找到drawable下面的progress_horizontal.xml,這就是我們今天的主角了:
復制代碼 代碼如下:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#ff9d9e9d"
                    android:centerColor="#ff5a5d5a"
                    android:centerY="0.75"
                    android:endColor="#ff747674"
                    android:angle="270"
            />
        </shape>
    </item>
    
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#80ffd300"
                        android:centerColor="#80ffb600"
                        android:centerY="0.75"
                        android:endColor="#a0ffcb00"
                        android:angle="270"
                />
            </shape>
        </clip>
    </item>
    
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerY="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="270"
                />
            </shape>
        </clip>
    </item>
    
</layer-list>

看到android:id="@android:id/progress"木有,看到android:id="@android:id/secondaryProgress"木有
把這個文件復制到自己工程下的drawable,就可以隨心所欲的修改shape的屬性,漸變,圓角等等
那么怎么放一個圖片進去呢,ok,新建progress_horizontal1.xml:

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:id="@android:id/progress" android:drawable="@drawable/progressbar" />
    
</layer-list>

在android:drawable中指定你處理好的圖片
然后回到布局中:

復制代碼 代碼如下:

<ProgressBar
            android:id="@+id/progressBar1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/progressBar"
            android:layout_margin="5dip"
            android:layout_toRightOf="@+id/progressBarV"
            android:background="@drawable/progress_bg"
            android:indeterminate="false"
            android:indeterminateOnly="false"
            android:maxHeight="20dip"
            android:minHeight="20dip"
            android:padding="2dip"
            android:progress="50"
            android:progressDrawable="@drawable/progress_horizontal1" />

android:background="@drawable/progress_bg"指定背景
android:progressDrawable="@drawable/progress_horizontal1"前景使用上面的progress_horizontal1
ok,搞定

注意看,四角還是有圓倒角的,貌似是系統自己加上去的,總之我的圖片里面是沒有做這個倒角處理的
二)縱向進度條

還是得從源碼入手,看回progress_horizontal.xml

復制代碼 代碼如下:

<item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerY="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="270"
                />
            </shape>
        </clip>
    </item>

為什么shape外面要包一層clip呢,官方文檔解釋是clipdrawable是可以自我復制的,來看看定義

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<clip
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:clipOrientation=["horizontal" | "vertical"]
    android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
                     "fill_vertical" | "center_horizontal" | "fill_horizontal" |
                     "center" | "fill" | "clip_vertical" | "clip_horizontal"] />

android:clipOrientation有兩個屬性,默認為horizontal
android:gravity有兩個屬性,默認為left
那我們試試改成vertical和bottom會有什么效果,新建一個progress_vertical.xml,把源碼progress_horizontal.xml的內容復制過來,這里去掉了secondaryProgress,修改了clip,shape的漸變中心centerY改為centerX

復制代碼 代碼如下:

<item android:id="@android:id/progress">
        <clip
            android:clipOrientation="vertical"
            android:gravity = "bottom">
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerX="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="90"
                />
            </shape>
        </clip>
    </item>

布局中android:progressDrawable="@drawable/progress_vertical"
ok,搞定,就是這么簡單:

三)弧形bar

這個也許算不上是進度條,用的也不多,最多也就儀表盤用用,不然誰會把進度條整成圓弧的呢。好吧這個可不是改改源碼就能搞定的,看代碼:

復制代碼 代碼如下:

public class Arcs extends View {  
    private Paint mArcPaint;  
    private Paint mArcBGPaint;  
  
    private RectF mOval;  
    private float mSweep = 0;  
    private int mSpeedMax = 200;
    private int mThreshold = 100;
    private int mIncSpeedValue = 0;
    private int mCurrentSpeedValue = 0; 
    private float mCenterX;  
    private float mCenterY;  
    private float mSpeedArcWidth;  
 
    private final float SPEED_VALUE_INC = 2; 
 
    .......... 
 

首先是一堆成員變量,兩個Paint用來畫圓弧一個前景一個背景,一個RectF圓弧就畫在上面,然后是一些控制參數比如sweep圓弧掃過的角度,xy坐標等等。

復制代碼 代碼如下:

mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mArcPaint.setStyle(Paint.Style.STROKE);
        mArcPaint.setStrokeWidth(mSpeedArcWidth);
//        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mArcPaint.setColor(0xff81ccd6);
        BlurMaskFilter mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.INNER);
        mArcPaint.setMaskFilter(mBlur);
        
        mArcBGPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mArcBGPaint.setStyle(Paint.Style.STROKE);
        mArcBGPaint.setStrokeWidth(mSpeedArcWidth+8);
        mArcBGPaint.setColor(0xff171717);
        
        BlurMaskFilter mBGBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.INNER);
      mArcBGPaint.setMaskFilter(mBGBlur);

設置兩個畫筆,顏色,寬度,樣式等等,BlurMaskFilter筆是邊緣模糊效果,有幾種,可以自己嘗試。

復制代碼 代碼如下:

@Override
protected void onSizeChanged(int w, int h, int ow, int oh) {
        super.onSizeChanged(w, h, ow, oh);
        Log.i("onSizeChanged w", w+"");
        Log.i("onSizeChanged h", h+"");
        mCenterX = w * 0.5f;  // remember the center of the screen
        mCenterY = h - mSpeedArcWidth;
        mOval = new RectF(mCenterX - mCenterY, mSpeedArcWidth, mCenterX + mCenterY, mCenterY * 2);
    }

重寫父類View的onSizeChanged,為的是自己根據布局中的大小做居中處理

復制代碼 代碼如下:

@Override  
    protected void onDraw(Canvas canvas) { 
        drawSpeed(canvas); 
        calcSpeed(); 
    } 
 
private void drawSpeed(Canvas canvas) { 
        canvas.drawArc(mOval, 179, 181, false, mArcBGPaint); 
 
        mSweep = (float) mIncSpeedValue / mSpeedMax * 180; 
        if (mIncSpeedValue > mThreshold) { 
            mArcPaint.setColor(0xFFFF0000); 
        } 
        else { 
            mArcPaint.setColor(0xFF00B0F0); 
        } 
         
        canvas.drawArc(mOval, 180, mSweep, false, mArcPaint);         
    } 
 
private void calcSpeed() { 
        if (mIncSpeedValue < mCurrentSpeedValue) { 
            mIncSpeedValue += SPEED_VALUE_INC; 
            if (mIncSpeedValue > mCurrentSpeedValue) { 
                mIncSpeedValue = mCurrentSpeedValue; 
            } 
            invalidate(); 
        } 
        else if (mIncSpeedValue > mCurrentSpeedValue) { 
            mIncSpeedValue -= SPEED_VALUE_INC; 
            if (mIncSpeedValue < mCurrentSpeedValue) { 
                mIncSpeedValue = mCurrentSpeedValue; 
            } 
            invalidate(); 
        } 
    } 

重寫onDraw以便重繪canvas
drawSpeed里面
通過計算mSweep = (float) mIncSpeedValue / mSpeedMax * 180;
然后canvas.drawArc(mOval, 180, mSweep, false, mArcPaint);
會根據mSweep的變化,畫出相應長度的弧度來
根據與閾值的對比,還可以設定不同的 顏色:

復制代碼 代碼如下:

if (mIncSpeedValue > mThreshold) {
   mArcPaint.setColor(0xFFFF0000);
  }
  else {
   mArcPaint.setColor(0xFF00B0F0);
  }

calcSpeed通過一個步進來控制增量或減量,以使弧度自然過渡,減少跳躍
ok,大功告成。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人免费va影院高清| 精品久久久av| 日韩在线视频观看正片免费网站| 成人性生交xxxxx网站| 中日韩美女免费视频网站在线观看| 91大神在线播放精品| 久久福利视频网| 久久精品国产久精国产一老狼| 精品久久久国产精品999| 国产精品日韩欧美| 日韩一级黄色av| 欧美福利视频网站| 日韩免费看的电影电视剧大全| 色yeye香蕉凹凸一区二区av| 精品日韩美女的视频高清| 国产日韩在线观看av| 国产精品一区二区久久精品| 国产精品亚洲精品| 国产精品∨欧美精品v日韩精品| 日韩精品免费电影| 国产一区二区视频在线观看| 日韩精品免费在线视频| 91产国在线观看动作片喷水| 夜色77av精品影院| 久久久亚洲国产| 成人在线精品视频| 国内精品久久久久久中文字幕| 中文字幕亚洲欧美日韩在线不卡| 国产精品自产拍在线观| 疯狂蹂躏欧美一区二区精品| 97成人在线视频| 国产中文字幕日韩| 色一情一乱一区二区| 国产丝袜精品第一页| 欧美做受高潮1| 亚洲欧美国产一本综合首页| 亚洲香蕉成人av网站在线观看| 日本久久久久久久久| 亚洲影院污污.| 性欧美办公室18xxxxhd| 欧美激情综合亚洲一二区| 亚洲激情视频在线观看| 国产精品在线看| 亚洲网站在线观看| 日本久久久久久久久| 国产一区二区在线免费视频| 亚洲欧美在线x视频| 亚洲欧美综合图区| 国产日韩欧美自拍| 国产999精品久久久影片官网| 九九热精品在线| 亚洲一区av在线播放| 一区二区三区无码高清视频| 成人精品一区二区三区电影免费| 国产亚洲成av人片在线观看桃| 九色成人免费视频| 欧美疯狂做受xxxx高潮| 久久久久久久一区二区三区| 亚洲有声小说3d| 97精品视频在线| 91情侣偷在线精品国产| 亚洲精品国产精品国产自| 日韩美女免费视频| 欧美一区二区三区精品电影| 亚洲国产中文字幕在线观看| 日韩一区二区欧美| 日本中文字幕不卡免费| 亚洲社区在线观看| 日韩av电影免费观看高清| 97超级碰碰碰| 亚洲国产精品va在线观看黑人| 中文字幕日韩av电影| 91av在线国产| 亚洲毛片在线看| 久久久免费精品视频| 欧美理论电影在线播放| 亚洲欧洲在线播放| 九九热99久久久国产盗摄| 亚洲经典中文字幕| 亚洲欧洲国产一区| 456国产精品| 久久精品视频播放| 亚洲毛片在线观看| 欧美日韩国产成人在线观看| 高清欧美一区二区三区| 欧美在线国产精品| 亚洲在线视频福利| www.xxxx精品| 欧美综合激情网| 亚洲国产精品va在线| 午夜精品视频在线| 国产美女搞久久| 亚洲欧美成人一区二区在线电影| 国产精品视频资源| 中文字幕亚洲一区在线观看| 91成人性视频| 日本午夜人人精品| 中文字幕欧美精品在线| 亚洲免费一在线| 日韩精品视频三区| 中日韩美女免费视频网站在线观看| 亚洲网站在线看| 日本一区二区三区四区视频| 久久久久五月天| 日韩欧美有码在线| 欧美精品国产精品日韩精品| 韩国视频理论视频久久| 中文字幕亚洲一区在线观看| 国产精品久久久久国产a级| 日本三级久久久| 欧美性xxxx极品hd满灌| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲一区精品电影| 国产精品一二三在线| 国产成人免费av| 日韩大陆欧美高清视频区| 97超级碰在线看视频免费在线看| 视频在线观看一区二区| 7777kkkk成人观看| 国产精品国内视频| 欧美一级电影在线| 狠狠躁夜夜躁人人爽超碰91| 欧美精品一二区| 日韩中文字幕网站| 一区二区成人av| 国产精品96久久久久久又黄又硬| 久操成人在线视频| 欧美小视频在线观看| 欧美性理论片在线观看片免费| 国产精品jizz在线观看麻豆| 亚洲人免费视频| 日韩精品免费一线在线观看| 日韩人在线观看| 欧美性猛交xxxx黑人| 一本一本久久a久久精品牛牛影视| 成人在线小视频| 欧美日韩美女视频| 国产偷国产偷亚洲清高网站| 国产亚洲欧洲在线| 亚洲人成电影网站色www| 日韩福利视频在线观看| 69av成年福利视频| 欧美另类xxx| 国产日韩中文字幕在线| 国产精品亚洲一区二区三区| 欧美激情极品视频| 日韩在线小视频| 一区二区三区美女xx视频| 性欧美亚洲xxxx乳在线观看| 性视频1819p久久| 免费99精品国产自在在线| 欧美性极品少妇精品网站| 日本国产精品视频| 国内精品国产三级国产在线专| 青青久久av北条麻妃海外网| 亚洲高清在线观看| 91免费高清视频| 91人成网站www| 久久成人精品电影| 美女撒尿一区二区三区| 欧美高清一级大片| 欧美色播在线播放| 欧美电影在线免费观看网站| 国模gogo一区二区大胆私拍|