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); } } }