【Android开发Design】进度条和活动
Android中的常用控件之进度条(ProgressBar)

Android中的常⽤控件之进度条(ProgressBar)ProgressBar的常⽤属性:style,进度条的样式,默认为圆形,⽤style="?android:attr/progressBarStyleHorizontal"可以将进度条设为条状;android:progress,进度条当前所处进度;android:max,进度条总进度。
⽤线程实现进度条的注意事项:不能在主线程中执⾏耗时的操作,只能在⼦线程中操作;另外,在⼦线程中不能操作主线程中的控件(ProgressBar除外):修改后MainActivity.java⾥的代码如下:public class MainActivity extends AppCompatActivity {private int p=0;//当前进度private ProgressBar pb_main_download;//进度条private TextView tv_main_desc;//显⽰⽂本的控件private MyHandler myHandler=new MyHandler();//新写的Handler类public class MyHandler extends Handler{@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);int code=msg.what;//接受处理码switch (code){case 1:p++;pb_main_download.setProgress(p);//给进度条的当前进度赋值tv_main_desc.setText(p+"%");//显⽰当前进度为多少break;}}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);//根据ID找到进度条pb_main_download=findViewById(R.id.pb_main_download);//根据ID找到显⽰⽂本的控件tv_main_desc=findViewById(_main_desc);}//点击Download按钮所调⽤的⽅法public void download(View view) {if(0==p){//如果当前进度为0new myThread().start();//开启线程}}public class myThread extends Thread{@Overridepublic void run() {super.run();while(true){try {Thread.sleep(100);//使线程休眠0.1秒} catch (InterruptedException e) {e.printStackTrace();}if(p==100){//当前进度等于总进度时退出循环p=0;break;}Message msg=new Message();msg.what=1;myHandler.sendMessage(msg);//发送处理码}}}}。
Android开发之进度条ProgressBar

Android开发之进度条ProgressBar说明ProgressBar⼀般⽤于显⽰⼀个过程,例如数据加载过程,⽂件下载进度,⾳乐播放进度等。
默认形式ProgressBar默认⽅式下,ProgressBar显⽰为圆形进度,循环转圈,不显⽰具体的进度值,控制其显隐藏即可,如下默认适⽤于界⾯加载//xml中<ProgressBarandroid:layout_width="wrap_content"android:layout_height="wrap_content" />//代码中控制显隐藏mProgressBar = (ProgressBar) findViewById(R.id.progress_bar_main);mProgressBar.setVisibility(View.VISIBLE);横向ProgressBar横向带进度的进度条,通过设置ProgressBar的Style为style="?android:attr/progressBarStyleHorizontal"image.pngmax属性指定进度条总进度值,progress设置当前进度值,也可以说是初始进度值//xml中<ProgressBarandroid:id="@+id/progress_bar_h"style="?android:attr/progressBarStyleHorizontal"android:layout_width="85dp"android:layout_height="10dp"android:layout_gravity="center"android:max="100"android:progress="50"/>设进度条背景系统⾃带的进度条的颜⾊⽐较单调,实际开发中使⽤较少,可以⾃定义进度条背景,新建⼀个progressbar_bg.xml⽂件<?xml version="1.0" encoding="UTF-8"?><layer-list xmlns:android="/apk/res/android"><!-- 设置背景⾊ --><item android:id="@android:id/background"android:drawable="@mipmap/feed_grow_progress_bar"></item><!-- 设置进度条颜⾊ --><item android:id="@android:id/progress"><clip><shape><gradientandroid:endColor="#fff000"android:startColor="#fff000" /></shape></clip></item></layer-list>gradient可以设置进度条的渐变⾊, android:endColor和 android:startColor可以设置渐变开始和结束的颜⾊。
Android-做个性化的进度条

Android-做个性化的进度条1.案例效果图2.准备素材progress1.png(78*78) progress2.png(78*78)3.原理采⽤⼀张图⽚作为ProgressBar的背景图⽚(⼀般采⽤颜⾊⽐较浅的)。
另⼀张是进度条的图⽚(⼀般采⽤颜⾊⽐较深的图⽚)。
进度在滚动时:进度图⽚逐步显⽰,背景图⽚逐步隐藏,达到上⾯的效果。
4.灵感来⾃Android控件提供的源码4.1 默认带进度的进度条,如下图[html]1. <ProgressBar2. android:id="@+id/progressBar2"3. style="@android:style/Widget.ProgressBar.Horizontal"4. android:layout_width="268dp"5. android:layout_height="wrap_content"6. android:progress="45" /><ProgressBarandroid:id="@+id/progressBar2"style="@android:style/Widget.ProgressBar.Horizontal"android:layout_width="268dp"android:layout_height="wrap_content"android:progress="45" />注意:关键是style属性在起作⽤4.2 找到样式定义的位置⿏标放在style属性值上,按下Ctrl键,出现超链接,点击超链接跳转到样式的定义位置样式定义的内容如下重点研究:android:progressDrawable:进度条的样式@android:drawable/progress_horizontal:样式定义的⽂件在android-sdk-windows\platforms\android-14\data\res⽬下搜索progress_horizontal.xml⽂件,搜索结果如下:打开progress_horizontal.xml⽂件,内容如下[html]1. <layer-listxmlns:androidlayer-listxmlns:android="/apk/res/android">2. <itemandroid:iditemandroid:id="@android:id/background">3. <shape>4. <cornersandroid:radiuscornersandroid:radius="5dip"/>5. <gradient6. android:startColor="#ff9d9e9d"7. android:centerColor="#ff5a5d5a"8. android:centerY="0.75"9. android:endColor="#ff747674"10. android:angle="270"11. />12. </shape>13. </item>14. <itemandroid:iditemandroid:id="@android:id/secondaryProgress">15. <clip>16. <shape>17. <cornersandroid:radiuscornersandroid:radius="5dip"/>18. <gradient19. android:startColor="#80ffd300"20. android:centerColor="#80ffb600"21. android:centerY="0.75"22. android:endColor="#a0ffcb00"23. android:angle="270"24. />25. </shape>26. </clip>27. </item>28. <itemandroid:iditemandroid:id="@android:id/progress">29. <clip>30. <shape>31. <cornersandroid:radiuscornersandroid:radius="5dip"/>32. <gradient33. android:startColor="#ffffd300"34. android:centerColor="#ffffb600"35. android:centerY="0.75"36. android:endColor="#ffffcb00"37. android:angle="270"38. />39. </shape>40. </clip>41. </item>42. </layer-list><layer-listxmlns:android="/apk/res/android"><itemandroid:id="@android:id/background"><shape><cornersandroid:radius="5dip"/><gradientandroid:startColor="#ff9d9e9d"android:centerColor="#ff5a5d5a"android:centerY="0.75"android:endColor="#ff747674"android:angle="270"/></shape></item><itemandroid:id="@android:id/secondaryProgress"><clip><shape><cornersandroid:radius="5dip"/><gradientandroid:startColor="#80ffd300"android:centerColor="#80ffb600"android:centerY="0.75"android:endColor="#a0ffcb00"android:angle="270"/></shape></clip></item><itemandroid:id="@android:id/progress"><clip><shape><cornersandroid:radius="5dip"/><gradientandroid:startColor="#ffffd300"android:centerColor="#ffffb600"android:centerY="0.75"android:endColor="#ffffcb00"android:angle="270"/></shape></clip></item></layer-list>释义:<item android:id="@android:id/background">:定义进度条的背景样式<item android:id="@android:id/secondaryProgress">:辅助进度条的样式<item android:id="@android:id/progress">:进度条的样式思考:如果我想做垂直进度条,怎么办了?关键在clip元素的属性上做修改<clipandroid:clipOrientation="vertical"定义滚动的⽅向 vertical为垂直⽅向android:drawable="@drawable/progress1"定义进度的图⽚android:gravity="bottom" >定义进度的开始位置</clip>5.定义样式⽂件progress_vertical.xmlprogress_vertical.xml⽂件代码如下[html]1. <?xmlversionxmlversion="1.0"encoding="utf-8"?>2. <layer-listxmlns:androidlayer-listxmlns:android="/apk/res/android">3. <itemandroid:iditemandroid:id="@android:id/progress">4. <clip5. android:clipOrientation="vertical"6. android:drawable="@drawable/progress1"7. android:gravity="bottom">8. </clip>9. </item>10. </layer-list><?xmlversion="1.0"encoding="utf-8"?><layer-listxmlns:android="/apk/res/android"><itemandroid:id="@android:id/progress"><clipandroid:clipOrientation="vertical"android:drawable="@drawable/progress1"android:gravity="bottom"></clip></item></layer-list>6.应⽤⾃定义的样式[html]1. <Button2. android:id="@+id/btStart"3. android:layout_width="fill_parent"4. android:layout_height="wrap_content"5. android:layout_marginTop="150dp"6. android:text="开始"/>7.8. <ProgressBar9. android:id="@+id/pbPic"10. style="@android:style/Widget.ProgressBar.Horizontal"11. android:layout_width="50dp"12. android:layout_height="68dp"13. android:background="@drawable/progress2"14. android:max="100"15. android:progress="0"16. android:progressDrawable="@drawable/progress_vertical" /> <!-- 在此属性上应⽤ -->17.18. <TextView19. android:id="@+id/txtProgress"20. android:layout_width="wrap_content"21. android:layout_height="wrap_content"/><Buttonandroid:id="@+id/btStart"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="150dp"android:text="开始"/><ProgressBarandroid:id="@+id/pbPic"style="@android:style/Widget.ProgressBar.Horizontal"android:layout_width="50dp"android:layout_height="68dp"android:background="@drawable/progress2"android:max="100"android:progress="0"android:progressDrawable="@drawable/progress_vertical" /> <!-- 在此属性上应⽤ --><TextViewandroid:id="@+id/txtProgress"android:layout_width="wrap_content"android:layout_height="wrap_content"/>7.点击按钮模拟进度滚动的效果[java]1. <span style="color:#333333;">public class ProgressActivity extends Activity {2. ProgressBar pb = null;3. TextView txtProgress;4. Handler handler = new Handler();5. @Override6. publicvoid onCreate(Bundle savedInstanceState) {7. super.onCreate(savedInstanceState);8. setContentView(yout.main);9. System.out.println("主题=" + getTheme() + "");10. pb = (ProgressBar) findViewById(R.id.pbPic);11. Button btnStart = (Button) findViewById(R.id.btStart);//按钮12. txtProgress = (TextView) findViewById(R.id.txtProgress);//显⽰进度13. btnStart.setOnClickListener(new OnClickListener() {//按钮点击事件14. publicvoid onClick(View v) {15. new Thread(new Runnable() {//创建并启动线程,使⽤线程执⾏模拟的任务16. publicvoid run() {17. for (inti = 0; i < 100; i++) { //循环100遍18. try {19. handler.post(new Runnable() { //更新界⾯的数据20. publicvoid run() {21. pb.incrementProgressBy(1);//增加进度22. txtProgress.setText(pb.getProgress() + "%");//显⽰完成的进度23. }24. });25. Thread.sleep(100);26. } catch (InterruptedException e) {27.28. }29. }30. }31. }).start();32. }33. });34. }</span>35. }<span style="color:#333333;">public class ProgressActivity extends Activity {ProgressBar pb = null;TextView txtProgress;Handler handler = new Handler();@Overridepublicvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);System.out.println("主题=" + getTheme() + "");pb = (ProgressBar) findViewById(R.id.pbPic);Button btnStart = (Button) findViewById(R.id.btStart);//按钮txtProgress = (TextView) findViewById(R.id.txtProgress);//显⽰进度btnStart.setOnClickListener(new OnClickListener() {//按钮点击事件publicvoid onClick(View v) {new Thread(new Runnable() {//创建并启动线程,使⽤线程执⾏模拟的任务publicvoid run() {for (inti = 0; i < 100; i++) { //循环100遍try {handler.post(new Runnable() { //更新界⾯的数据publicvoid run() {pb.incrementProgressBy(1);//增加进度txtProgress.setText(pb.getProgress() + "%");//显⽰完成的进度 }});Thread.sleep(100);} catch (InterruptedException e) {}}}}).start();}});}</span>}。
Android自定义进度条-带文本(文字进度)的水平进度条(ProgressBar)

Android⾃定义进度条-带⽂本(⽂字进度)的⽔平进度条(ProgressBar)⽔平进度条,显⽰进度的⽂本随着进度⽽移动。
效果如下,截的静态图。
代码如下 TextProgressBar.javapublic class TextProgressBar extends ProgressBar {private Paint mPaint;private String text;private float rate;public TextProgressBar(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinitView();}public TextProgressBar(Context context) {super(context);initView();}private void initView() {mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setColor(Color.BLUE);}@Overridepublic synchronized void setProgress(int progress) {setText(progress);super.setProgress(progress);}private void setText(int progress) {rate = progress * 1.0f / this.getMax();int i = (int) (rate * 100);this.text = String.valueOf(i) + "%";}@Overrideprotected synchronized void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);Rect rect = new Rect();mPaint.getTextBounds(text, 0, this.text.length(), rect);// int x = (getWidth()/2) - rect.centerX();// int y = (getHeight()/2) - rect.centerY();int x = (int) (getWidth() * rate);if (x == getWidth()) {// 如果为百分之百则在左边绘制。
Android实现简单的加载进度条

Android实现简单的加载进度条本⽂实例为⼤家分享了Android实现简单的加载进度条的具体代码,供⼤家参考,具体内容如下1.效果图2.⾃定义progressBarpackage com.example.myapplication7;import android.animation.ValueAnimator;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.os.Bundle;import android.os.Parcelable;import android.util.AttributeSet;import android.view.animation.AccelerateDecelerateInterpolator;import android.widget.ProgressBar;import ng.annotation.Retention;import ng.annotation.RetentionPolicy;import androidx.annotation.IntDef;public class CircleProgressView extends ProgressBar {private int mReachBarSize = Utils.dp2px(getContext(), 2); // 未完成进度条⼤⼩private int mNormalBarSize = Utils.dp2px(getContext(), 2); // 未完成进度条⼤⼩private int mReachBarColor = Color.parseColor("#108ee9"); // 已完成进度颜⾊private int mNormalBarColor = Color.parseColor("#FFD3D6DA"); // 未完成进度颜⾊private int mTextSize = Utils.sp2px(getContext(), 14); // 进度值字体⼤⼩private int mTextColor = Color.parseColor("#108ee9"); // 进度的值字体颜⾊private float mTextSkewX; // 进度值字体倾斜⾓度private String mTextSuffix = "%"; // 进度值前缀private String mTextPrefix = ""; // 进度值后缀private boolean mTextVisible = true; // 是否显⽰进度值private boolean mReachCapRound; // 画笔是否使⽤圆⾓边界,normalStyle下⽣效private int mRadius = Utils.dp2px(getContext(), 20); // 半径private int mStartArc; // 起始⾓度private int mInnerBackgroundColor; // 内部背景填充颜⾊private int mProgressStyle = ProgressStyle.NORMAL; // 进度风格private int mInnerPadding = Utils.dp2px(getContext(), 1); // 内部圆与外部圆间距private int mOuterColor; // 外部圆环颜⾊private boolean needDrawInnerBackground; // 是否需要绘制内部背景private RectF rectF; // 外部圆环绘制区域private RectF rectInner; // 内部圆环绘制区域private int mOuterSize = Utils.dp2px(getContext(), 1); // 外层圆环宽度private Paint mTextPaint; // 绘制进度值字体画笔private Paint mNormalPaint; // 绘制未完成进度画笔private Paint mReachPaint; // 绘制已完成进度画笔private Paint mInnerBackgroundPaint; // 内部背景画笔private Paint mOutPaint; // 外部圆环画笔private int mRealWidth;private int mRealHeight;@IntDef({ProgressStyle.NORMAL, ProgressStyle.FILL_IN, ProgressStyle.FILL_IN_ARC})@Retention(RetentionPolicy.SOURCE)public @interface ProgressStyle {int NORMAL = 0;int FILL_IN = 1;int FILL_IN_ARC = 2;}public CircleProgressView(Context context) {this(context, null);}public CircleProgressView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public CircleProgressView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);obtainAttributes(attrs);initPaint();}private void initPaint() {mTextPaint = new Paint();mTextPaint.setColor(mTextColor);mTextPaint.setStyle(Paint.Style.FILL);mTextPaint.setTextSize(mTextSize);mTextPaint.setTextSkewX(mTextSkewX);mTextPaint.setAntiAlias(true);mNormalPaint = new Paint();mNormalPaint.setColor(mNormalBarColor);mNormalPaint.setStyle(mProgressStyle == ProgressStyle.FILL_IN_ARC ? Paint.Style.FILL : Paint.Style.STROKE); mNormalPaint.setAntiAlias(true);mNormalPaint.setStrokeWidth(mNormalBarSize);mReachPaint = new Paint();mReachPaint.setColor(mReachBarColor);mReachPaint.setStyle(mProgressStyle == ProgressStyle.FILL_IN_ARC ? Paint.Style.FILL : Paint.Style.STROKE); mReachPaint.setAntiAlias(true);mReachPaint.setStrokeCap(mReachCapRound ? Paint.Cap.ROUND : Paint.Cap.BUTT);mReachPaint.setStrokeWidth(mReachBarSize);if (needDrawInnerBackground) {mInnerBackgroundPaint = new Paint();mInnerBackgroundPaint.setStyle(Paint.Style.FILL);mInnerBackgroundPaint.setAntiAlias(true);mInnerBackgroundPaint.setColor(mInnerBackgroundColor);}if (mProgressStyle == ProgressStyle.FILL_IN_ARC) {mOutPaint = new Paint();mOutPaint.setStyle(Paint.Style.STROKE);mOutPaint.setColor(mOuterColor);mOutPaint.setStrokeWidth(mOuterSize);mOutPaint.setAntiAlias(true);}}private void obtainAttributes(AttributeSet attrs) {TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.CircleProgressView);mProgressStyle = ta.getInt(R.styleable.CircleProgressView_cpv_progressStyle, ProgressStyle.NORMAL);// 获取三种风格通⽤的属性mNormalBarSize = (int) ta.getDimension(R.styleable.CircleProgressView_cpv_progressNormalSize, mNormalBarSize); mNormalBarColor = ta.getColor(R.styleable.CircleProgressView_cpv_progressNormalColor, mNormalBarColor);mReachBarSize = (int) ta.getDimension(R.styleable.CircleProgressView_cpv_progressReachSize, mReachBarSize); mReachBarColor = ta.getColor(R.styleable.CircleProgressView_cpv_progressReachColor, mReachBarColor);mTextSize = (int) ta.getDimension(R.styleable.CircleProgressView_cpv_progressTextSize, mTextSize);mTextColor = ta.getColor(R.styleable.CircleProgressView_cpv_progressTextColor, mTextColor);mTextSkewX = ta.getDimension(R.styleable.CircleProgressView_cpv_progressTextSkewX, 0);if (ta.hasValue(R.styleable.CircleProgressView_cpv_progressTextSuffix)) {mTextSuffix = ta.getString(R.styleable.CircleProgressView_cpv_progressTextSuffix);}if (ta.hasValue(R.styleable.CircleProgressView_cpv_progressTextPrefix)) {mTextPrefix = ta.getString(R.styleable.CircleProgressView_cpv_progressTextPrefix);}mTextVisible = ta.getBoolean(R.styleable.CircleProgressView_cpv_progressTextVisible, mTextVisible);mRadius = (int) ta.getDimension(R.styleable.CircleProgressView_cpv_radius, mRadius);rectF = new RectF(-mRadius, -mRadius, mRadius, mRadius);switch (mProgressStyle) {case ProgressStyle.FILL_IN:mReachBarSize = 0;mNormalBarSize = 0;mOuterSize = 0;break;case ProgressStyle.FILL_IN_ARC:mStartArc = ta.getInt(R.styleable.CircleProgressView_cpv_progressStartArc, 0) + 270;mInnerPadding = (int) ta.getDimension(R.styleable.CircleProgressView_cpv_innerPadding, mInnerPadding);mOuterColor = ta.getColor(R.styleable.CircleProgressView_cpv_outerColor, mReachBarColor);mOuterSize = (int) ta.getDimension(R.styleable.CircleProgressView_cpv_outerSize, mOuterSize);mReachBarSize = 0;// 将画笔⼤⼩重置为0mNormalBarSize = 0;if (!ta.hasValue(R.styleable.CircleProgressView_cpv_progressNormalColor)) {mNormalBarColor = Color.TRANSPARENT;}int mInnerRadius = mRadius - mOuterSize / 2 - mInnerPadding;rectInner = new RectF(-mInnerRadius, -mInnerRadius, mInnerRadius, mInnerRadius);break;case ProgressStyle.NORMAL:mReachCapRound = ta.getBoolean(R.styleable.CircleProgressView_cpv_reachCapRound, true);mStartArc = ta.getInt(R.styleable.CircleProgressView_cpv_progressStartArc, 0) + 270;if (ta.hasValue(R.styleable.CircleProgressView_cpv_innerBackgroundColor)) {mInnerBackgroundColor = ta.getColor(R.styleable.CircleProgressView_cpv_innerBackgroundColor, Color.argb(0, 0, 0, 0)); needDrawInnerBackground = true;}break;}ta.recycle();}@Overrideprotected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int maxBarPaintWidth = Math.max(mReachBarSize, mNormalBarSize);int maxPaintWidth = Math.max(maxBarPaintWidth, mOuterSize);int height = 0;int width = 0;switch (mProgressStyle) {case ProgressStyle.FILL_IN:height = getPaddingTop() + getPaddingBottom() // 边距+ Math.abs(mRadius * 2); // 直径width = getPaddingLeft() + getPaddingRight() // 边距+ Math.abs(mRadius * 2); // 直径break;case ProgressStyle.FILL_IN_ARC:height = getPaddingTop() + getPaddingBottom() // 边距+ Math.abs(mRadius * 2) // 直径+ maxPaintWidth;// 边框width = getPaddingLeft() + getPaddingRight() // 边距+ Math.abs(mRadius * 2) // 直径+ maxPaintWidth;// 边框break;case ProgressStyle.NORMAL:height = getPaddingTop() + getPaddingBottom() // 边距+ Math.abs(mRadius * 2) // 直径+ maxBarPaintWidth;// 边框width = getPaddingLeft() + getPaddingRight() // 边距+ Math.abs(mRadius * 2) // 直径+ maxBarPaintWidth;// 边框break;}mRealWidth = resolveSize(width, widthMeasureSpec);mRealHeight = resolveSize(height, heightMeasureSpec);setMeasuredDimension(mRealWidth, mRealHeight);}@Overrideprotected synchronized void onDraw(Canvas canvas) {switch (mProgressStyle) {case ProgressStyle.NORMAL:drawNormalCircle(canvas);break;case ProgressStyle.FILL_IN:drawFillInCircle(canvas);break;case ProgressStyle.FILL_IN_ARC:drawFillInArcCircle(canvas);break;}}/*** 绘制PROGRESS_STYLE_FILL_IN_ARC圆形*/private void drawFillInArcCircle(Canvas canvas) {canvas.save();canvas.translate(mRealWidth / 2, mRealHeight / 2);// 绘制外层圆环canvas.drawArc(rectF, 0, 360, false, mOutPaint);// 绘制内层进度实⼼圆弧// 内层圆弧半径float reachArc = getProgress() * 1.0f / getMax() * 360;canvas.drawArc(rectInner, mStartArc, reachArc, true, mReachPaint);// 绘制未到达进度if (reachArc != 360) {canvas.drawArc(rectInner, reachArc + mStartArc, 360 - reachArc, true, mNormalPaint); }canvas.restore();}/*** 绘制PROGRESS_STYLE_FILL_IN圆形*/private void drawFillInCircle(Canvas canvas) {canvas.save();canvas.translate(mRealWidth / 2, mRealHeight / 2);float progressY = getProgress() * 1.0f / getMax() * (mRadius * 2);float angle = (float) (Math.acos((mRadius - progressY) / mRadius) * 180 / Math.PI);float startAngle = 90 + angle;float sweepAngle = 360 - angle * 2;// 绘制未到达区域rectF = new RectF(-mRadius, -mRadius, mRadius, mRadius);mNormalPaint.setStyle(Paint.Style.FILL);canvas.drawArc(rectF, startAngle, sweepAngle, false, mNormalPaint);// 翻转180度绘制已到达区域canvas.rotate(180);mReachPaint.setStyle(Paint.Style.FILL);canvas.drawArc(rectF, 270 - angle, angle * 2, false, mReachPaint);// ⽂字显⽰在最上层最后绘制canvas.rotate(180);// 绘制⽂字if (mTextVisible) {String text = mTextPrefix + getProgress() + mTextSuffix;float textWidth = mTextPaint.measureText(text);float textHeight = (mTextPaint.descent() + mTextPaint.ascent());canvas.drawText(text, -textWidth / 2, -textHeight / 2, mTextPaint);}}/*** 绘制PROGRESS_STYLE_NORMAL圆形*/private void drawNormalCircle(Canvas canvas) {canvas.save();canvas.translate(mRealWidth / 2, mRealHeight / 2);// 绘制内部圆形背景⾊if (needDrawInnerBackground) {canvas.drawCircle(0, 0, mRadius - Math.min(mReachBarSize, mNormalBarSize) / 2, mInnerBackgroundPaint);}// 绘制⽂字if (mTextVisible) {String text = mTextPrefix + getProgress() + mTextSuffix;float textWidth = mTextPaint.measureText(text);float textHeight = (mTextPaint.descent() + mTextPaint.ascent());canvas.drawText(text, -textWidth / 2, -textHeight / 2, mTextPaint);}// 计算进度值float reachArc = getProgress() * 1.0f / getMax() * 360;// 绘制未到达进度if (reachArc != 360) {canvas.drawArc(rectF, reachArc + mStartArc, 360 - reachArc, false, mNormalPaint); }// 绘制已到达进度canvas.drawArc(rectF, mStartArc, reachArc, false, mReachPaint);canvas.restore();}/*** 动画进度(0-当前进度)** @param duration 动画时长*/public void runProgressAnim(long duration) {setProgressInTime(0, duration);}/*** @param progress 进度值* @param duration 动画播放时间*/public void setProgressInTime(final int progress, final long duration) {setProgressInTime(progress, getProgress(), duration);}/*** @param startProgress 起始进度* @param progress 进度值* @param duration 动画播放时间*/public void setProgressInTime(int startProgress, final int progress, final long duration) {ValueAnimator valueAnimator = ValueAnimator.ofInt(startProgress, progress);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animator) {//获得当前动画的进度值,整型,1-100之间int currentValue = (Integer) animator.getAnimatedValue();setProgress(currentValue);}});AccelerateDecelerateInterpolator interpolator = new AccelerateDecelerateInterpolator(); valueAnimator.setInterpolator(interpolator);valueAnimator.setDuration(duration);valueAnimator.start();}public int getReachBarSize() {return mReachBarSize;}public void setReachBarSize(int reachBarSize) {mReachBarSize = Utils.dp2px(getContext(), reachBarSize);invalidate();}public int getNormalBarSize() {return mNormalBarSize;}public void setNormalBarSize(int normalBarSize) {mNormalBarSize = Utils.dp2px(getContext(), normalBarSize); invalidate();}public int getReachBarColor() {return mReachBarColor;}public void setReachBarColor(int reachBarColor) {mReachBarColor = reachBarColor;invalidate();}public int getNormalBarColor() {return mNormalBarColor;}public void setNormalBarColor(int normalBarColor) {mNormalBarColor = normalBarColor;invalidate();}public int getTextSize() {return mTextSize;}public void setTextSize(int textSize) {mTextSize = Utils.sp2px(getContext(), textSize);invalidate();}public int getTextColor() {return mTextColor;}public void setTextColor(int textColor) {mTextColor = textColor;invalidate();}public float getTextSkewX() {return mTextSkewX;}public void setTextSkewX(float textSkewX) {mTextSkewX = textSkewX;invalidate();}public String getTextSuffix() {return mTextSuffix;}public void setTextSuffix(String textSuffix) {mTextSuffix = textSuffix;invalidate();}public String getTextPrefix() {return mTextPrefix;}public void setTextPrefix(String textPrefix) {mTextPrefix = textPrefix;invalidate();}public boolean isTextVisible() {return mTextVisible;}public void setTextVisible(boolean textVisible) {mTextVisible = textVisible;invalidate();}public boolean isReachCapRound() {return mReachCapRound;}public void setReachCapRound(boolean reachCapRound) {mReachCapRound = reachCapRound;invalidate();}public int getRadius() {return mRadius;}public void setRadius(int radius) {mRadius = Utils.dp2px(getContext(), radius);invalidate();}public int getStartArc() {return mStartArc;}public void setStartArc(int startArc) {mStartArc = startArc;invalidate();}public int getInnerBackgroundColor() {return mInnerBackgroundColor;}public void setInnerBackgroundColor(int innerBackgroundColor) {mInnerBackgroundColor = innerBackgroundColor;invalidate();}public int getProgressStyle() {return mProgressStyle;}public void setProgressStyle(int progressStyle) {mProgressStyle = progressStyle;invalidate();}public int getInnerPadding() {return mInnerPadding;}public void setInnerPadding(int innerPadding) {mInnerPadding = Utils.dp2px(getContext(), innerPadding);int mInnerRadius = mRadius - mOuterSize / 2 - mInnerPadding;rectInner = new RectF(-mInnerRadius, -mInnerRadius, mInnerRadius, mInnerRadius); invalidate();}public int getOuterColor() {return mOuterColor;}public void setOuterColor(int outerColor) {mOuterColor = outerColor;invalidate();}public int getOuterSize() {return mOuterSize;}public void setOuterSize(int outerSize) {mOuterSize = Utils.dp2px(getContext(), outerSize);invalidate();}private static final String STATE = "state";private static final String PROGRESS_STYLE = "progressStyle";private static final String TEXT_COLOR = "textColor";private static final String TEXT_SIZE = "textSize";private static final String TEXT_SKEW_X = "textSkewX";private static final String TEXT_VISIBLE = "textVisible";private static final String TEXT_SUFFIX = "textSuffix";private static final String TEXT_PREFIX = "textPrefix";private static final String REACH_BAR_COLOR = "reachBarColor";private static final String REACH_BAR_SIZE = "reachBarSize";private static final String NORMAL_BAR_COLOR = "normalBarColor";private static final String NORMAL_BAR_SIZE = "normalBarSize";private static final String IS_REACH_CAP_ROUND = "isReachCapRound"; private static final String RADIUS = "radius";private static final String START_ARC = "startArc";private static final String INNER_BG_COLOR = "innerBgColor";private static final String INNER_PADDING = "innerPadding";private static final String OUTER_COLOR = "outerColor";private static final String OUTER_SIZE = "outerSize";@Overridepublic Parcelable onSaveInstanceState() {final Bundle bundle = new Bundle();bundle.putParcelable(STATE, super.onSaveInstanceState());// 保存当前样式bundle.putInt(PROGRESS_STYLE, getProgressStyle());bundle.putInt(RADIUS, getRadius());bundle.putBoolean(IS_REACH_CAP_ROUND, isReachCapRound());bundle.putInt(START_ARC, getStartArc());bundle.putInt(INNER_BG_COLOR, getInnerBackgroundColor());bundle.putInt(INNER_PADDING, getInnerPadding());bundle.putInt(OUTER_COLOR, getOuterColor());bundle.putInt(OUTER_SIZE, getOuterSize());// 保存text信息bundle.putInt(TEXT_COLOR, getTextColor());bundle.putInt(TEXT_SIZE, getTextSize());bundle.putFloat(TEXT_SKEW_X, getTextSkewX());bundle.putBoolean(TEXT_VISIBLE, isTextVisible());bundle.putString(TEXT_SUFFIX, getTextSuffix());bundle.putString(TEXT_PREFIX, getTextPrefix());// 保存已到达进度信息bundle.putInt(REACH_BAR_COLOR, getReachBarColor());bundle.putInt(REACH_BAR_SIZE, getReachBarSize());// 保存未到达进度信息bundle.putInt(NORMAL_BAR_COLOR, getNormalBarColor());bundle.putInt(NORMAL_BAR_SIZE, getNormalBarSize());return bundle;}@Overridepublic void onRestoreInstanceState(Parcelable state) {if (state instanceof Bundle) {final Bundle bundle = (Bundle) state;mProgressStyle = bundle.getInt(PROGRESS_STYLE);mRadius = bundle.getInt(RADIUS);mReachCapRound = bundle.getBoolean(IS_REACH_CAP_ROUND); mStartArc = bundle.getInt(START_ARC);mInnerBackgroundColor = bundle.getInt(INNER_BG_COLOR);mInnerPadding = bundle.getInt(INNER_PADDING);mOuterColor = bundle.getInt(OUTER_COLOR);mOuterSize = bundle.getInt(OUTER_SIZE);mTextColor = bundle.getInt(TEXT_COLOR);mTextSize = bundle.getInt(TEXT_SIZE);mTextSkewX = bundle.getFloat(TEXT_SKEW_X);mTextVisible = bundle.getBoolean(TEXT_VISIBLE);mTextSuffix = bundle.getString(TEXT_SUFFIX);mTextPrefix = bundle.getString(TEXT_PREFIX);mReachBarColor = bundle.getInt(REACH_BAR_COLOR);mReachBarSize = bundle.getInt(REACH_BAR_SIZE);mNormalBarColor = bundle.getInt(NORMAL_BAR_COLOR);mNormalBarSize = bundle.getInt(NORMAL_BAR_SIZE);initPaint();super.onRestoreInstanceState(bundle.getParcelable(STATE));return;}super.onRestoreInstanceState(state);}@Overridepublic void invalidate() {initPaint();super.invalidate();}}3.设置宽⾼package com.example.myapplication7;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.text.TextUtils;import android.util.DisplayMetrics;import android.view.WindowManager;import java.util.Collection;import androidx.annotation.ColorRes;public class Utils {private static WindowManager windowManager;private static WindowManager getWindowManager(Context context) {if (windowManager == null) {windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); }return windowManager;}public static float getDensity(Context context) {return context.getResources().getDisplayMetrics().density;}public static float getFontDensity(Context context) {return context.getResources().getDisplayMetrics().scaledDensity;}public static DisplayMetrics getDisplayMetrics(Context context) {DisplayMetrics displayMetrics = new DisplayMetrics();getWindowManager(context).getDefaultDisplay().getMetrics(displayMetrics);return displayMetrics;}public static int dp2px(Context context, float dp) {return (int) (getDensity(context) * dp + 0.5f);}public static int px2dp(Context context, float px) {return (int) (px / getDensity(context) + 0.5f);}public static int sp2px(Context context, float sp) {return (int) (getFontDensity(context) * sp + 0.5f);}public static int px2sp(Context context, float px) {return (int) (px / getFontDensity(context) + 0.5f);}public static int getWindowWidth(Context context) {return getDisplayMetrics(context).widthPixels;}public static int getWindowHeight(Context context) {return getDisplayMetrics(context).heightPixels;}public static String getPathFormat(String path) {if (!TextUtils.isEmpty(path)) {int lastPeriodIndex = stIndexOf('.');if (lastPeriodIndex > 0 && lastPeriodIndex + 1 < path.length()) {String format = path.substring(lastPeriodIndex + 1);if (!TextUtils.isEmpty(format)) {return format.toLowerCase();}}}return "";}public static boolean isGif(String url) {return "gif".equals(getPathFormat(url));}public static Bitmap getTextBitmap(Context context, int width, int height, int radius, String text, int textSize, @ColorRes int bgColor) {radius = dp2px(context, radius);Bitmap bitmap = Bitmap.createBitmap(dp2px(context, width), dp2px(context, height), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);RectF rect = new RectF(0, 0, canvas.getWidth(), canvas.getHeight());Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setColor(context.getResources().getColor(bgColor));canvas.drawRoundRect(new RectF(0, 0, rect.width(), rect.height()), radius, radius, paint);paint.setColor(Color.WHITE);paint.setTextSize(dp2px(context, textSize));paint.setTextAlign(Paint.Align.CENTER);Paint.FontMetricsInt fontMetrics = paint.getFontMetricsInt();float baseline = (rect.bottom + rect.top - fontMetrics.bottom - fontMetrics.top) / 2;canvas.drawText(text, rect.centerX(), baseline, paint);return bitmap;}public static Drawable getTextDrawable(Context context, int width, int height, int radius, String text, int textSize, @ColorRes int bgColor) { return new BitmapDrawable(getTextBitmap(context, width, height, radius, text, textSize, bgColor));}public static boolean isEmpty(Collection<?> collection) {return collection == null || collection.isEmpty();}public static int getSize(Collection<?> collection) {return collection == null ? 0 : collection.size();}}4.主界⾯package com.example.myapplication7;import android.graphics.Bitmap;import android.graphics.Color;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private String fileName;private CircleProgressView progressView;private Bitmap bitmap;private int i = 0;final Handler handler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(@NonNull Message msg) {if (msg.what == 1) {//do somethingint a = (int) msg.obj;Log.e("TAG", "handleMessage" + a);progressView.setProgress(a * 10);if (a == 10) {progressView.setVisibility(View.GONE);}}return false;}});@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);progressView = findViewById(R.id.progressView);getWindow().setTitleColor(Color.rgb(65, 183, 216));//主线程中调⽤:new Thread(new MyThread()).start();}class MyThread extends Thread {//这⾥也可⽤Runnable接⼝实现@Overridepublic void run() {while (true) {try {Thread.sleep(500);//每隔1s执⾏⼀次Message msg = new Message();msg.what = 1;i++;msg.obj = i;handler.sendMessage(msg);} catch (InterruptedException e) {e.printStackTrace();}}}}}5.布局<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android" xmlns:app="/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.example.myapplication7.CircleProgressViewandroid:id="@+id/progressView"android:layout_width="150dp"android:layout_height="150dp"android:progress="0"app:cpv_innerPadding="2dp"app:cpv_outerColor="@android:color/darker_gray"app:cpv_outerSize="1dp"app:cpv_progressNormalColor="@android:color/darker_gray"app:cpv_progressReachColor="@color/white"app:cpv_progressStyle="FillInnerArc" /></LinearLayout>6.资源⽂件<?xml version="1.0" encoding="utf-8"?><resources><declare-styleable name="CircleProgressView"><attr name="cpv_progressNormalColor" format="color" /><attr name="cpv_progressReachColor" format="color" /><attr name="cpv_progressTextColor" format="color" /><attr name="cpv_progressTextSize" format="dimension" /><attr name="cpv_progressTextOffset" format="dimension" /><attr name="cpv_progressNormalSize" format="dimension" /><attr name="cpv_progressReachSize" format="dimension" /><attr name="cpv_radius" format="dimension" /><attr name="cpv_progressTextVisible" format="boolean" /><attr name="cpv_progressStartArc" format="integer" /><attr name="cpv_progressTextSkewX" format="dimension" /><attr name="cpv_progressTextPrefix" format="string" /><attr name="cpv_progressTextSuffix" format="string" /><attr name="cpv_innerBackgroundColor" format="color" /><attr name="cpv_progressStyle" format="enum"><enum name="Normal" value="0" /><enum name="FillInner" value="1" /><enum name="FillInnerArc" value="2" /></attr><attr name="cpv_innerProgressColor" format="color" /><attr name="cpv_innerPadding" format="dimension" /><attr name="cpv_outerColor" format="color" /><attr name="cpv_outerSize" format="dimension" /><attr name="cpv_reachCapRound" format="boolean" /></declare-styleable></resources>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
android进度条、滑动条和评分控件

android进度条、滑动条和评分控件所谓进度条、滑动条和评分控件,在⼿机应⽤中,相信你见过加载游戏时、更新应⽤时等情况,屏幕出现⼀条进度栏,这⾥称之为进度条;当你调节⾳量时出现的这⾥即称作滑动条;⽽评分控件,当你在淘宝给卖家评价时出现的类似5星评价,这⾥即称作评分控件,下⾯将分别详细说明这三种控件的基础使⽤⽅法。
⼀、ProgressBar进度条控件1. ⾸先ProgressBar进度条给出了两种样式,分别是progressBarStyleLarge和progressBarStyleHorizontal,此次主要以progressBarStyleHorizontal⽔平进度条为例讲解,可在视图布局Form Widgets中找到,其布局代码和布局演⽰⽰例如下。
2.ProgressBar进度条需要创建⼀个继承AsyncTask抽象类的Activity,并重写doInBackground和onProgressUpdate⽅法,来实现进度条的基础功能,在此之前确保已经创建了Acticity并获取了ProgressBar控件。
其代码如下:3. 增加按钮创建点击事件使进度条可以实现功能,并设置最⼤数值100。
其代码如下。
⼆、SeekBar滑动条控件1.2.3.然后调⽤SeekBar控件,并设置总进度⼤⼩和设置监听事件,以便对滑动条后续操作。
和ProgressBar进度条⼀样,⽤到了setMax⽅法来确定⼤⼩。
另外还⽤到了setOnSeekBarChangeListener进⾏监听滑动条的事件状态。
相关代码如下:三、RatingBar评分控件1.2.3.然后同样再在Activity中调⽤RatingBar控件,并使⽤setOnRatingBarChangeListener⽅法来测试监听评分的状态。
相关代码如下:4. 3最后针对如System.out.println("-->"+rating);这个形式,这个测试⽅法,可以过滤的多余的⽆⽤LogCat信息,进⽽⽅便我们测试。
android各种进度条(ProgressBar)
android各种进度条(ProgressBar)当⼀个应⽤在后台执⾏时,前台界⾯就不会有什么信息,这时⽤户根本不知道程序是否在执⾏、执⾏进度如何、应⽤程序是否遇到错误终⽌等,这时需要使⽤进度条来提⽰⽤户后台程序执⾏的进度。
Android系统提供了两⼤类进度条样式,长形进度条(progress-BarStyleHorizontal)和圆形进度条(progressBarStyleLarge)。
进度条⽤处很多,⽐如,应⽤程序装载资源和⽹络连接时,可以提⽰⽤户稍等,这⼀类进度条只是代表应⽤程序中某⼀部分的执⾏情况,⽽整个应⽤程序执⾏情况呢,则可以通过应⽤程序标题栏来显⽰⼀个进度条,这就需要先对窗⼝的显⽰风格进⾏设置"requestWindowFeature(Window.FEATURE_PROGRESS)"。
我们看看这个⽰例程序的运⾏效果先上布局⽂件:1 <?xml version="1.0" encoding="utf-8"?>2 <LinearLayout xmlns:android="/apk/res/android"3 android:orientation="vertical"4 android:layout_width="fill_parent"5 android:layout_height="fill_parent"6 >7 <TextView8 android:layout_width="fill_parent"9 android:layout_height="wrap_content"10 android:text="@string/hello"11 />1213 <ProgressBar14 android:id="@+id/ProgressBar01"15 style="?android:attr/progressBarStyleHorizontal"16 android:layout_width="200dp"17 android:layout_height="wrap_content"18 android:visibility="gone"19 />2021 <ProgressBar22 android:id="@+id/ProgressBar02"23 style="?android:attr/progressBarStyleLarge"24 android:layout_width="wrap_content"25 android:layout_height="wrap_content"26 android:max="100"27 android:progress="50"28 android:secondaryProgress="70"29 android:visibility="gone"30 />3132 <Button33 android:id="@+id/Button01"34 android:layout_width="wrap_content"35 android:layout_height="wrap_content"36 android:text="开始"/>3738 </LinearLayout>ProgressBar01 为长形进度条,Progress02为圆形进度条,标题栏进度条没有在这⾥声明。
麦子学院Android开发教程之进度条解析
IT在线教育平台———麦子学院:Android开发中,有很多的功能在实际应用中都起了很大的作用,比如android进度条的实现方式,进度条分为以下两种:●进度条分不确定(indeterminate=true)和确定(indeterminate=false)2种。
默认值是不确定(indeterminate=true)Android进度条。
●Android进度条有4种风格可以使用。
默认值是progressBarStyle。
设置成progressBarStyleSmall后,图标变小。
设置成progressBarStyleLarge后,图标变大设置成progressBarStyleHorizontal后,变成横向长方形。
●确定(indeterminate=false)进度条中的最大值的设定,调用setMax()方法。
●Android进度条中当前进度值的设置,调用setProgress()方法。
●第2进度值的设置,调用setSecondaryProgress()方法。
例程源码(Java)1.ProgressBar progressBarHorizontal =2.(ProgressBar) findViewById(id.progressBarHorizontal);3.progressBarHorizontal.setMax(100);4.progressBarHorizontal.setProgress(30);5.progressBarHorizontal.setSecondaryProgress(70);复制代码Android进度条例程源码(Resource)1.< ProgressBar android:id="@+id/progressBarHorizontal"2.android:layout_height="wrap_content"3.android:layout_width="fill_parent"4.style="?android:attr/progressBarStyleHorizontal" />复制代码如需了解更多相关知识,请至麦子学院官网查询(/)。
Android自定义进度条的圆角横向进度条实例详解
Android⾃定义进度条的圆⾓横向进度条实例详解1.本⽂将向你介绍⾃定义进度条的写法,⽐较简单,但还是有些知识点是需要注意的:invalidate()⽅法RectF⽅法的应⽤onMeasure⽅法的应⽤2.原理画3层圆⾓矩形,底层为⿊⾊,第⼆层为灰⾊,最上⼀层为进度条颜⾊,⽰例图如下:3.效果图实现圆⾓进度条还有很多其他⽅法,⽐如在Progress控件⾥填充圆⾓图⽚,通过拉伸图⽚来达到预想的效果,虽然听起来很简单,但实现起来还是有些⿇烦的。
4.解说⽅法(1)invalidate()⽅法invalidate()是⽤来刷新View的,必须是在UI线程中进⾏⼯作。
⽐如在修改某个view的显⽰时,调⽤invalidate()才能看到重新绘制的界⾯。
invalidate()的调⽤是把之前的旧的view从主UI线程队列中pop掉。
⼀般在⾃定义控件中会⽤到这个⽅法。
(2)RectF⽅法的应⽤RectF是⽤来绘画矩形的⽅法。
RectF(left,top,right,bottom),四个参数的含义分别是⽗控件距离矩形左上右下边距的距离,以下⽤图来说明:drawRoundRect⽅法是⽤来绘制圆⾓矩形的,它的参数如下:参数说明rect:RectF对象。
rx:x⽅向上的圆⾓半径。
ry:y⽅向上的圆⾓半径。
paint:绘制时所使⽤的画笔。
(3)onMeasure⽅法指定⾃定义控件在屏幕上的⼤⼩,onMeasure⽅法的两个参数是由上⼀层控件传⼊的⼤⼩,⽽且是模式和尺⼨混合在⼀起的数值,需要MeasureSpec.getMode(widthMeasureSpec) 得到模式,MeasureSpec.getSize(widthMeasureSpec)得到尺⼨。
onMeasure的⼏种模式分别为EXACTLY,AT_MOST,UNSPECIFIED。
[1]MeasureSpec.EXACTLYMeasureSpec.EXACTLY是精确尺⼨,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width=”50dip”,或者为FILL_PARENT是,都是控件⼤⼩已经确定的情况,都是精确尺⼨。
Android实现绚丽的自定义进度条
Android实现绚丽的⾃定义进度条⽬录前⾔效果图实现步骤1.绘制背景圆形矩形2.绘制进度3.绘制⽂字4.加⼊动画完整代码前⾔进度条是在Android项⽬中很常⽤的组件之⼀,如果想要理解它是怎么实现的,⾸先还需要了解⾃定义view和Android坐标系相关的知识,下⾯我来详细地介绍⼀下⾃定义进度条的实现过程。
效果图实现步骤1.绘制背景圆形矩形⾸先要画出⼀个圆形矩形,RectF⾥⾯传递的是矩形左上⾓和右下⾓的xy坐标,这是⽤来确定矩形的位置和⼤⼩,然后在矩形内部画出⼀个圆形矩形。
核⼼代码:canvas.drawRoundRect()private void drawBackground(Canvas canvas){//圆⾓矩形RectF rectF = new RectF(padding, padding, mWidth - padding, mHeight - padding);canvas.drawRoundRect(rectF, round, round, mPaintRoundRect);}2.绘制进度其实⾥⾯的进度条也是圆形矩形,只不过进度条的画笔是实⼼的。
内部进度条矩形的⼤⼩需要略⼩于外⾯的矩形,这样就可以实现上⾯的这种效果。
如果进度条矩形⼤于或等于背景矩形⼤⼩的话那就完全压住背景中的边框,显⽰出来的只是⼀个没有边框的进度条,所以这⾥需要减掉strokeWidth。
private void drawProgress(Canvas canvas){if (process!=0){RectF rectProgress = new RectF(padding + strokeWidth, padding + strokeWidth, process, mHeight - padding - strokeWidth);//内部进度条canvas.drawRoundRect(rectProgress, round, round, mPaint);}}3.绘制⽂字下⾯来看看怎么居中⽂字:getWidth() / 2 得到的结果是中间位置的x坐标,但是从这⾥开始绘制⽂字的话不能实现居中的效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当某个操作会花费较长的时间才能完成,应当给用户提供视觉反馈,让用户知道正在进行的任务以及是否已经完成。
=进度条=
如果您可以知道当前任务完成的比例,那么使用进度条,让用户了解⼤约还需要多久才能完成。
进度条应当表示从 0% 到 100%。
不要把进度条设置到更低的值,也不要用同⼀个进度条代表多个事件。
如果您不确定操作将会花费多少时间,可以使用“不确定进度条”。
=活动=
如果您不确定操作将会花费多少时间,可以使用“不确定进度条”。
有两种样式: 长条和圆圈。
根据界面上的可用空间选则使用哪⼀种样式。
==1. 不确定进度条 (Holo 深色主题)==
电⼦市场在应用开始下载前,使用不确定进度条表示状态。
因为连接服务器打开时下载的时间不确定。
==2. 活动圆圈 (Holo 浅色主题)==
Gmail 应用在邮件载⼊时使用活动圆圈表示状态,因为下载⼀封邮件的时间无法确定。
在每个界面中,您应当只使用⼀个进度条,并且要调整到合适的⼤⼩。
例如在空白的视图中使用⼤号活动圆圈,而不要将它用在⼀个较⼩的对话框中。
贡献者:
iceskysl jiayouhe123
©eoe移动开发者社区
本文链接: /page/Progress_。