进度条是 app 中最司空见惯的控件了,上面就来理解一下。
一、简介
进度条是 UI 界面中一种十分实用的组件,通常用于向用户像是某个耗时操作实现的百分比。进度条可动静地显示进度,因而防止长时间地执行某个操作时,让用户感觉程序失去了响应,从而更好地进步用户界面的敌对性。
进度条大体分为 程度型(条形)和 环形 如图所示:简直所有的花色的进度条都次要为这两种类型。
二、罕用属性和办法
属性名 | 含意 |
---|---|
style | 设置进度条的格调 |
max | 设置该进度条的最大值 |
maxHeight | 进度 Widget 最大高 |
miniHeight | 进度 Widget 最小高 |
maxWidth | 进度 Widget 最大宽 |
minWidth | 进度 Widget 最小宽 |
progress | 设置该进度条的已实现进度值 |
progressDrawable | 自定义 drawable 显示 |
indeteminateDrawable | 设置绘制不显示进度的进度条的 Drawable 对象 |
indeterminate | 该属性设为 true,设置进度条不准确显示进度 |
indeteminateDuration | 设置不准确显示进度的持续时间 |
secondaryProgress | 定义二级进度值,值介于 0 到 max。该进度在主进度和背景之间。比方用于网络播放视频时,二级进度用于示意缓冲进度,主进度用于示意播放进度。 |
interpolator | 设置动画速度 |
indeterminateBehavior | 定义当进度达到最大时,不确定模式的体现;该值必须为 repeat 或者 cycle,repeat 示意进度从 0 从新开始;cycle 示意进度放弃以后值,并且回到 0 |
style 属性:
- @android:style/Widget.ProgressBar.Horizontal:程度进度条
- @android:style/Widget.ProgressBar.Inverse:一般大小的进度条
- @android:style/Widget.ProgressBar.Large:大环形进度条
- @android:style/Widget.ProgressBar.Large.Inverse:大环形进度条
- @android:style/Widget.ProgressBar.Small:小环形进度条
- @android:style/Widget.ProgressBar.Small.Inverse:小环形进度条
在 java 代码中,咱们罕用的办法有:
getMax() // 返回这个进度条的范畴的下限 getProgress(): 返回进度
getsecondaryProgress() // 返回二级进度
incrementProgressBy(int diff) // 指定减少的进度
isIndeterminate() // 批示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate) // 设置不确定模式下
三、简略应用
-
编写布局文件
<!-- 零碎提供的进度条 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="程度进度条" android:layout_marginTop="50dp" android:layout_gravity="center"/> <ProgressBar android:id="@+id/progress_01" android:layout_width="match_parent" android:layout_height="30dp" android:max="100" android:layout_marginTop="100dp" android:padding="20dp" style="@style/Widget.AppCompat.ProgressBar.Horizontal"/> <TextView android:id="@+id/tv_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/progress_01" android:layout_centerHorizontal="true"/>
- 编写 java 代码,细节在代码正文里
public class MainActivity extends AppCompatActivity {
private ProgressBar mProgressBar;
private TextView mTextView;
private int start=0,maxprogress;
private Handler mHandler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {super.handleMessage(msg);
switch (msg.what){
case 0:
mTextView.setText(start+"%");// 更新进度
mProgressBar.setProgress(start);break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressBar = findViewById(R.id.progress_01);
mTextView=findViewById(R.id.tv_progress);
maxprogress=mProgressBar.getMax();}
@Override
protected void onStart() {super.onStart();
// 启动线程加载
new Thread() {
@Override
public void run() {while (true) {
try {Thread.sleep(1000);// 线程休眠 1s
int a = new Random().nextInt(10);// 产生一个 10 以内的随机数
start += a;
if (start > maxprogress)// 如果过程超过最大值
break;
mHandler.sendEmptyMessage(0);// 在安卓里。咱们不能间接在线程中更新 UI,这里用 Hander 音讯解决
} catch (InterruptedException e) {e.printStackTrace();
}
}
}
}.start();}
}
成果:
四、自定义 ProgressBar
有时候,零碎款式的进度条曾经无奈满足咱们的需要,这个时候咱们就须要自定义进度条的款式了。
上面来实现下这个简略的自定义进度条,在从 0 到 max 的过程中会逐渐扭转色彩,色彩是能够自定义的。次要实现是引入一个自定义的 xml 资源文件,通过 android:progressDrawable
属性给 ProgressBar 映射该 xml 资源文件。
上图的 xml 资源文件为:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dp"/>
</shape>
<!-- 背景色彩 -->
<color android:color="#CCCCCC"/>
</item>
<item android:id="@android:id/progress">
<clip
android:clipOrientation="horizontal"
android:gravity="left">
<shape>
<corners android:radius="5dp"/>
<!-- 开始色彩,中途色彩,最初色彩 -->
<gradient
android:startColor="#00FF00"
android:centerColor="#FFFF00"
android:endColor="#FF0000"/>
</shape>
</clip>
</item>
</layer-list>
layer-list 是一个层级嵌套的标签,能够嵌套多个 item 标签。在 item 中能够嵌套多种类型的标签,如 shape,bitmap,color 等,这些标签对应的都是 Drawable 的子类。
item 标签有 width,height,gravity,left,right,bottom,top…属性,管制 item 中子标签显示的地位。
安卓的标签很多,在当前的自定义控件会常常应用,可自行理解,后续讲其余控件我也会补充。
这样一个简略金玉其外; 败絮其中的自定义进度条就做好了,至于应用和上一个实例一样。