本节简介:
本节为大家带来的是Android基本UI控件中的Progresar (Progresar)。进度条的应用场景有很多,比如用户登录的时候,后台在发出请求,等待服务器返回信息。这时候就会用到进度条;或者一些耗时的操作需要等待很长时间的时候,这个时候如果没有提示,用户可能会认为是程序Carsh或者手机死机,会大大降低用户体验。所以,在需要耗时操作的地方,添加进度条,让用户知道当前程序正在执行,直观的告诉用户当前任务的进度等等!使用进度条可以给我带来这样的便利!好了,开始讲解本节内容吧~对了,Progresar官方API文档:Progresar
1.常见属性和基本示例的说明
从官方文件中,我们看到这样一个类图:
Progresar继承自View类,其直接子类为AbsSeekBar和ContentLoadingProgresar,其中AbsSeekBar子类为SeekBar和RatingBar,说明这两个子类也是基于Progresar实现的。
常见属性的详细说明:
android:max:进度条的最大值android:progress:进度条已完成进度值android:progressDrawable:设置轨道对应的Drawable对象android:indeterminate:如果设置成true,则进度条不精确显示进度android:indeterminateDrawable:设置不显示进度的进度条的Drawable对象android:indeterminateDuration:设置不精确显示进度的持续时间android:secondaryProgress:二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度,前者通过progress属性进行设置!
对应Ja,我们可以调用以下方法:
getMax():返回这个进度条的范围的上限getProgress():返回进度getSecondaryProgress():返回次要进度incrementProgresy(int diff):指定增加的进度isIndeterminate():指示进度条是否在不确定模式下setIndeterminate(boolean indeterminate):设置不确定模式下
我们来看看系统提供的默认进度条的例子!
使用系统默认进度条的示例:
操作效果图:
实施布局代码:
& ltlinear layout 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 “
工具:上下文= “。MainActivity ” >
& lt!-系统提供的圆形进度条,依次是大、中、小->:
& lt进度条
style=”@android:style/Widget。小进度条”
Android:layout _ width = ” wrap _ content “
Android:layout _ height = ” wrap _ content “/& gt;
& lt进度条
Android:layout _ width = ” wrap _ content “
Android:layout _ height = ” wrap _ content “/& gt;
& lt进度条
style=”@android:style/Widget。进度条。大”
Android:layout _ width = ” wrap _ content “
Android:layout _ height = ” wrap _ content “/& gt;
& lt!-系统提供的水平进度条->:
& lt进度条
style=”@android:style/Widget。水平进度条”
Android:layout _ width = ” match _ parent “
Android:layout _ height = ” wrap _ content “
安卓:max=”100 “
Android:progress = ” 18 “/& gt;
& lt进度条
style=”@android:style/Widget。水平进度条”
Android:layout _ width = ” match _ parent “
Android:layout _ height = ” wrap _ content “
android:layout_marginTop=”10dp “
Android:indeterminate = ” true “/& gt;
& lt/linear layout & gt;
好吧,除了第二个,什么都别想了…系统提供的东西满足不了我们的需求!下面来解释一下我们在实际开发中是如何处理进度条的!
2.使用动画代替圆形进度条
第一种方案是用一组连续的图片组成一帧动画。需要进度图的时候可以让动画可见,不需要的时候可以让动画不可见!而且这个动画一般是用AnimationDrawable实现的!好,让我们定义一个AnimationDrawable文件:
PS:用过的图片素材:进度条图片素材包装. zip
操作效果图:
实现步骤:在res目录下新建一个:anim文件,然后创建amin_pgbar.xml的资源文件:
& lt?xml版本=”1.0 “编码=”utf-8 “?& gt
& ltanimation-list xmlns:Android = ” http://schemas . Android . com/apk/RES/Android “
Android:one shot = ” false ” & gt;
& lt项目
Android:drawable = ” @ drawable/loading _ 01 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:draw able = ” @ draw able/loading _ 02 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:drawable = ” @ drawable/loading _ 03 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:draw able = ” @ draw able/loading _ 04 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:drawable = ” @ drawable/loading _ 05 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:draw able = ” @ draw able/loading _ 06 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:draw able = ” @ draw able/loading _ 07 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:draw able = ” @ draw able/loading _ 08 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:draw able = ” @ draw able/loading _ 09 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:draw able = ” @ draw able/loading _ 10 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:drawable = ” @ drawable/loading _ 11 “
Android:duration = ” 200 “/& gt;
& lt项目
Android:draw able = ” @ draw able/loading _ 12 “
Android:duration = ” 200 “/& gt;
& lt/animation-list & gt;
然后写一个布局文件,里面只有一个ImageView,用来显示进度条。将src设置为上面的可提取资源!最后到MainActivity.ja。
公共类MainActivity扩展AppCompatActivity {
private ImageView img_pgbar;private ImageView img _ pgbar
私人动画可绘制广告;
@覆盖
受保护的void onCreate(Bundle sed instancestate){
super . oncreate(sedInstanceState);
setContentView(r . layout . activity _ main);
img_pgbar = (ImageView) findViewById(R.id.img_pgbar);img _ pg bar =(ImageView)findViewById(r . id . img _ pg bar);
ad = (AnimationDrawable) img_pgbar.getDrawable();ad =(animation drawable)img _ pg bar . get drawable();
img_pgbar.postDelayed(new Runnable() {img _ pg bar . post delayed(new Runnable(){
@覆盖
公共无效运行(){
ad . start();
}
}, 100);
}
}
下面只是如何启动动画,剩下的就看你自己了~需要显示进度条的时候,让ImageView可见;不需要的时候就让他躲起来!其实Progresar本身就有一个indeterminateDrawable,只需将这个参数设置为上面的动画资源即可,但是进度条的图案大小不能直接修改,需要在Ja代码中修改。如果你设置了宽度和高度,而这个宽度和高度太大,你会看到有多个进度条…自己掂量吧~
3.自定义圆形进度条
我相信你看完2场会吐槽,,弄个动画骗人。哈哈,实际发展中就是这样。当然,以上情况只适用于不需要显示进度的场合,想显示进度也没用。好吧,我们来看看网上一个简单的自定义圆形进度条!代码还是比较简单的,通俗易懂,有兴趣可以看看,或者做相关扩展~
操作效果图:
实施代码:
自定义视图类:
/**
*由Jay于2015/8/5 0005创作。
*/
公共类CirclePgBar扩展视图{
私漆mBackPaint
私人油漆制造商;
私漆mTextPaint
私有浮点mStrokeWidth = 50
私有float mHalfStrokeWidth = mStrokeWidth/2;
私有float mRadius = 200
私人直接投资;
private int mProgress = 0;
//目标值可以随意更改。
private int mTargetProgress = 90
private int mMax = 100
private int mWidth
private int mHeight
公共CirclePgBar(上下文context) {
超级(上下文);
init();
}
public CirclePgBar(上下文上下文,属性集属性){
super(context,attrs);
init();
}
public circle gbar(Context Context,AttributeSet attrs,int defStyleAttr) {
super(context,attrs,defStyleAttr);
init();
}
//完成相关参数的初始化
私有void init() {
mBackPaint = new Paint();
mBackPaint.setColor(Color。白色);
mbackpaint . setantialias(true);
mBackPaint.setStyle(Paint。Style .笔画);
mbackpaint . setstrokewidth(mStrokeWidth);
mFrontPaint = new Paint();
mFrontPaint.setColor(Color。绿色);
mfront paint . setantialias(true);
mFrontPaint.setStyle(Paint。Style .笔画);
mfront paint . setstrokewidth(mStrokeWidth);
mTextPaint = new Paint();
mTextPaint.setColor(Color。绿色);
mtextpaint . setantialias(true);
mtextpaint . settextsize(80);
mTextPaint.setTextAlign(Paint。居中对齐);
}
//重写用于测量大小的onMeasure方法和用于绘图视图的核心方法onDraw()
@覆盖
受保护的void on measure(int width measurespec,int heightMeasureSpec) {
super . on measure(widthMeasureSpec,heighteasurespec);
mWidth = getRealSize(widthMeasureSpec);
MH height = get realsize(heightmesspec);
setMeasuredDimension(mWidth,m height);
}
@覆盖
受保护的void onDraw(画布画布){
init rect();
浮动角度= mProgress/(float)mMax * 360;
canvas.drawCircle(mWidth / 2,mHeight / 2,mRadius,mBackPaint);
canvas.drawArc(mRect,-90,angle,false,mfront paint);
canvas.drawText(mProgress + “% “,mWidth / 2 + mHalfStrokeWidth,mHeight / 2 + mHalfStrokeWidth,mTextPaint);
if(mProgress & lt;mTargetProgress) {
mProgress+= 1;
invalidate();
}
}
public int get realsize(int measure spec){
int result = 1;
int mode = measure spec . get mode(measure spec);
int size = measure spec . getsize(measure spec);
if (mode == MeasureSpec。至多|| mode == MeasureSpec。未指定){
//自己算
result =(int)(mRadius * 2+mStrokeWidth);
}否则{
结果=大小;
}
返回结果;
}
私有void initRect() {
if (mRect == null) {
mRect = new RectF();
int viewSize =(int)(mRadius * 2);
int left =(m width-viewSize)/2;
int top =(mHeight-viewSize)/2;
int right = left+viewSize;
int bottom = top+viewSize;
mRect.set(左、上、右、下);
}
}
}
然后补充:
& ltcom . Jay . progress bardemo . circle pgbar
Android:layout _ width = ” match _ parent “
Android:layout _ height = ” match _ parent “/& gt;
就这么简单~
本节概述:
本节介绍Android中常用的控件:Progresar,说明其基本用法,以及进度条在实际开发中的两种实现方法。第二个自定义进度条可以自己完善,然后在实际开发中使用~!