Android基礎控件ProgressBar進度條的使用


1、簡介

  ProgressBar繼承與View類,直接子類有AbsSeekBar和ContentLoadingProgressBar, 其中AbsSeekBar的子類有SeekBar和RatingBar!

android:max:進度條的最大值
android:progress:進度條已完成進度值
android:progressDrawable:設置軌道對應的Drawable對象
android:indeterminate:如果設置成true,則進度條不精確顯示進度
android:indeterminateDrawable:設置不顯示進度的進度條的Drawable對象
android:indeterminateDuration:設置不精確顯示進度的持續時間
android:secondaryProgress:二級進度條

 

2、簡單使用

  頭兩個是系統自帶,后面一個幀動畫一個自定義View!

  xml布局文件:

<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:gravity="center"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".LoginActivity">

        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@android:style/Widget.ProgressBar.Large"/>
        <ProgressBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:max="100"
            android:progress="10"
            android:secondaryProgress="20"
            style="@android:style/Widget.ProgressBar.Horizontal"/>
        <ImageView
            android:id="@+id/imageview11"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/amin_pgbar"/>
        <com.example.xianfengzhang.myapplication.CustomView.CirclePgBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
</LinearLayout>

  幀動畫布局文件:

<?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>

  幀動畫Java文件:

public class LoginActivity extends AppCompatActivity  {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        // Set up the login form.

        ImageView imageView = (ImageView)findViewById(R.id.imageview11);
        final AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getDrawable();
        imageView.postDelayed(new Runnable() {
            @Override
            public void run() {
                animationDrawable.start();
            }
        },100);
    }
}

  自定義View:

package com.example.xianfengzhang.myapplication.CustomView;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by xianfengzhang on 2017/12/22.
 */

@SuppressLint("ViewConstructor")
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;
    //目標值,想改多少就改多少
    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();
    }
    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);//設置字體對齊方式

    }

//onMeasure(測量控件大小的方法) 重寫onMeasure方法
    @Override
    protected  void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = getRealSize(widthMeasureSpec);
        mHeight = getRealSize(heightMeasureSpec);
        setMeasuredDimension(mWidth,mHeight);//保存測量的大小
    }
//onDraw繪制View自身的內容 重寫onDraw方法
    @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);//從提供的測量規范中獲取尺寸
//MeasureSpec其實就是尺寸和模式通過各種位運算計算出的一個整型值,它提供了三種模式,還有三個方法(合成約束、分離模式、分離尺寸)
//UNSPECIFIED(未指定):父控件沒有對子控件施加任何約束,子控件可以得到任意想要的大小!
//EXACTLY(完全):父控件給子控件決定了確切大小,子控件將被限定在給定的邊界里而忽略它本身大小。
//AT_MOST(至多):子控件至多達到指定大小的值。
        if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.UNSPECIFIED) {
            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);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM