国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Manual pembangunan Android / ProgressBar(進(jìn)度條)

ProgressBar(進(jìn)度條)

本節(jié)引言:

本節(jié)給大家?guī)?lái)的是Android基本UI控件中的ProgressBar(進(jìn)度條),ProgressBar的應(yīng)用場(chǎng)景很多,比如 用戶登錄時(shí),后臺(tái)在發(fā)請(qǐng)求,以及等待服務(wù)器返回信息,這個(gè)時(shí)候會(huì)用到進(jìn)度條;或者當(dāng)在進(jìn)行一些比較 耗時(shí)的操作,需要等待一段較長(zhǎng)的時(shí)間,這個(gè)時(shí)候如果沒(méi)有提示,用戶可能會(huì)以為程序Carsh或者手機(jī)死機(jī) 了,這樣會(huì)大大降低用戶體驗(yàn),所以在需要進(jìn)行耗時(shí)操作的地方,添加上進(jìn)度條,讓用戶知道當(dāng)前的程序 在執(zhí)行中,也可以直觀的告訴用戶當(dāng)前任務(wù)的執(zhí)行進(jìn)度等!使用進(jìn)度條可以給我?guī)?lái)這樣的便利! 好了,開(kāi)始講解本節(jié)內(nèi)容~ 對(duì)了,ProgressBar官方API文檔:ProgressBar


1.常用屬性講解與基礎(chǔ)實(shí)例

從官方文檔,我們看到了這樣一個(gè)類關(guān)系圖:

1.png

ProgressBar繼承與View類,直接子類有AbsSeekBar和ContentLoadingProgressBar, 其中AbsSeekBar的子類有SeekBar和RatingBar,可見(jiàn)這二者也是基于ProgressBar實(shí)現(xiàn)的

常用屬性詳解:

  • android:max:進(jìn)度條的最大值
  • android:progress:進(jìn)度條已完成進(jìn)度值
  • android:progressDrawable:設(shè)置軌道對(duì)應(yīng)的Drawable對(duì)象
  • android:indeterminate:如果設(shè)置成true,則進(jìn)度條不精確顯示進(jìn)度
  • android:indeterminateDrawable:設(shè)置不顯示進(jìn)度的進(jìn)度條的Drawable對(duì)象
  • android:indeterminateDuration:設(shè)置不精確顯示進(jìn)度的持續(xù)時(shí)間
  • android:secondaryProgress:二級(jí)進(jìn)度條,類似于視頻播放的一條是當(dāng)前播放進(jìn)度,一條是緩沖進(jìn)度,前者通過(guò)progress屬性進(jìn)行設(shè)置!

對(duì)應(yīng)的再Java中我們可調(diào)用下述方法:

  • getMax():返回這個(gè)進(jìn)度條的范圍的上限
  • getProgress():返回進(jìn)度
  • getSecondaryProgress():返回次要進(jìn)度
  • incrementProgressBy(int diff):指定增加的進(jìn)度
  • isIndeterminate():指示進(jìn)度條是否在不確定模式下
  • setIndeterminate(boolean indeterminate):設(shè)置不確定模式下

接下來(lái)來(lái)看看系統(tǒng)提供的默認(rèn)的進(jìn)度條的例子吧!

系統(tǒng)默認(rèn)進(jìn)度條使用實(shí)例:

運(yùn)行效果圖:

2.gif

實(shí)現(xiàn)布局代碼:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <!-- 系統(tǒng)提供的圓形進(jìn)度條,依次是大中小 -->

    <ProgressBar
        style="@android:style/Widget.ProgressBar.Small"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ProgressBar
        style="@android:style/Widget.ProgressBar.Large"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <!--系統(tǒng)提供的水平進(jìn)度條-->
    <ProgressBar
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="18" />

    <ProgressBar
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:indeterminate="true" />

</LinearLayout>


好吧,除了第二個(gè)能看,其他的就算了...系統(tǒng)提供的肯定是滿足不了我們的需求的! 下面我們就來(lái)講解下實(shí)際開(kāi)發(fā)中我們對(duì)進(jìn)度條的處理!


2.使用動(dòng)畫(huà)來(lái)替代圓形進(jìn)度條

第一個(gè)方案是,使用一套連續(xù)圖片,形成一個(gè)幀動(dòng)畫(huà),當(dāng)需要進(jìn)度圖的時(shí)候,讓動(dòng)畫(huà)可見(jiàn),不需要 的時(shí)候讓動(dòng)畫(huà)不可見(jiàn)即可!而這個(gè)動(dòng)畫(huà),一般是使用AnimationDrawable來(lái)實(shí)現(xiàn)的!好的,我們來(lái) 定義一個(gè)AnimationDrawable文件:

PS:用到的圖片素材:進(jìn)度條圖片素材打包.zip

運(yùn)行效果圖:

3.gif

<p實(shí)現(xiàn)步驟:

在res目錄下新建一個(gè):anim文件件,然后創(chuàng)建amin_pgbar.xml的資源文件:

<?xml version="1.0" encoding="utf-8"?>  
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
    android:oneshot="false" >  
 
    <item  
        android:drawable="@drawable/loading_01"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_02"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_03"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_04"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_05"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_06"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_07"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_08"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_09"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_10"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_11"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_12"  
        android:duration="200"/>  
 
</animation-list>

接著寫(xiě)個(gè)布局文件,里面僅僅有一個(gè)ImageView即可,用于顯示進(jìn)度條,把src設(shè)置為上述drawable資源即可! 最后到MainActivity.java

public class MainActivity extends AppCompatActivity {

    private ImageView img_pgbar;
    private AnimationDrawable ad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_pgbar = (ImageView) findViewById(R.id.img_pgbar);
        ad = (AnimationDrawable) img_pgbar.getDrawable();
        img_pgbar.postDelayed(new Runnable() {
            @Override
            public void run() {
                ad.start();
            }
        }, 100);
    }

}

這里只是寫(xiě)了如何啟動(dòng)動(dòng)畫(huà),剩下的就你自己來(lái)了哦~在需要顯示進(jìn)度條的時(shí)候,讓ImageView可見(jiàn); 在不需要的時(shí)候讓他隱藏即可!另外其實(shí)Progressbar本身有一個(gè)indeterminateDrawable,只需把 這個(gè)參數(shù)設(shè)置成上述的動(dòng)畫(huà)資源即可,但是進(jìn)度條條的圖案大小是不能直接修改的,需要Java代碼中 修改,如果你設(shè)置了寬高,而且這個(gè)寬高過(guò)大的時(shí)候,你會(huì)看到有多個(gè)進(jìn)度條...自己權(quán)衡下吧~


3.自定義圓形進(jìn)度條

相信你看完2會(huì)吐槽,臥槽,這么坑爹,拿個(gè)動(dòng)畫(huà)來(lái)坑人,哈哈,實(shí)際開(kāi)發(fā)中都這樣,當(dāng)然上述 這種情況只適用于不用顯示進(jìn)度的場(chǎng)合,如果要顯示進(jìn)度的場(chǎng)合就沒(méi)用處了,好吧,接下來(lái)看下 網(wǎng)上一個(gè)簡(jiǎn)單的自定義圓形進(jìn)度條!代碼還是比較簡(jiǎn)單,容易理解,又興趣可以看看,或者進(jìn)行相關(guān)擴(kuò)展~

運(yùn)行效果圖:

4.gif


/**
 * Created by Jay on 2015/8/5 0005.
 */
public class CirclePgBar extends View {


    private Paint mBackPaint;
    private Paint mFrontPaint;
    private Paint mTextPaint;
    private float mStrokeWidth = 50;
    private float mHalfStrokeWidth = mStrokeWidth / 2;
    private float mRadius = 200;
    private RectF mRect;
    private int mProgress = 0;
    //目標(biāo)值,想改多少就改多少
    private int mTargetProgress = 90;
    private int mMax = 100;
    private int mWidth;
    private int mHeight;


    public CirclePgBar(Context context) {
        super(context);
        init();
    }

    public CirclePgBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CirclePgBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }


    //完成相關(guān)參數(shù)初始化
    private void init() {
        mBackPaint = new Paint();
        mBackPaint.setColor(Color.WHITE);
        mBackPaint.setAntiAlias(true);
        mBackPaint.setStyle(Paint.Style.STROKE);
        mBackPaint.setStrokeWidth(mStrokeWidth);

        mFrontPaint = new Paint();
        mFrontPaint.setColor(Color.GREEN);
        mFrontPaint.setAntiAlias(true);
        mFrontPaint.setStyle(Paint.Style.STROKE);
        mFrontPaint.setStrokeWidth(mStrokeWidth);


        mTextPaint = new Paint();
        mTextPaint.setColor(Color.GREEN);
        mTextPaint.setAntiAlias(true);
        mTextPaint.setTextSize(80);
        mTextPaint.setTextAlign(Paint.Align.CENTER);
    }


    //重寫(xiě)測(cè)量大小的onMeasure方法和繪制View的核心方法onDraw()
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = getRealSize(widthMeasureSpec);
        mHeight = getRealSize(heightMeasureSpec);
        setMeasuredDimension(mWidth, mHeight);

    }


    @Override
    protected void onDraw(Canvas canvas) {
        initRect();
        float angle = mProgress / (float) mMax * 360;
        canvas.drawCircle(mWidth / 2, mHeight / 2, mRadius, mBackPaint);
        canvas.drawArc(mRect, -90, angle, false, mFrontPaint);
        canvas.drawText(mProgress + "%", mWidth / 2 + mHalfStrokeWidth, mHeight / 2 + mHalfStrokeWidth, mTextPaint);
        if (mProgress < mTargetProgress) {
            mProgress += 1;
            invalidate();
        }

    }

    public int getRealSize(int measureSpec) {
        int result = 1;
        int mode = MeasureSpec.getMode(measureSpec);
        int size = MeasureSpec.getSize(measureSpec);

        if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.UNSPECIFIED) {
            //自己計(jì)算
            result = (int) (mRadius * 2 + mStrokeWidth);
        } else {
            result = size;
        }

        return result;
    }

    private void initRect() {
        if (mRect == null) {
            mRect = new RectF();
            int viewSize = (int) (mRadius * 2);
            int left = (mWidth - viewSize) / 2;
            int top = (mHeight - viewSize) / 2;
            int right = left + viewSize;
            int bottom = top + viewSize;
            mRect.set(left, top, right, bottom);
        }
    }


}

實(shí)現(xiàn)代碼:

自定義View類:

然后在布局文件中加上:

 <com.jay.progressbardemo.CirclePgBar
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

就是這么簡(jiǎn)單~


本節(jié)小結(jié):

本節(jié)給大家介紹了Android中的常用控件:ProgressBar講解了基本用法,以及實(shí)際開(kāi)發(fā)中 對(duì)于進(jìn)度條的兩種實(shí)現(xiàn)方法,第二個(gè)自定義進(jìn)度條可以自行完善,然后用到實(shí)際開(kāi)發(fā)中~! 好的,本節(jié)就到這里,謝謝~