Android ProgressBar 分为水平进度条和圆形进度条, 看官方的划分是Indeterminate Progress(不确定的进度) 和 Determinate Progress(决定进度) 下面有2个demo 一个是圆形的进度条和一个水平的进度条
Indeterminate Progress:
当您不知道操作将花费多长时间时,请对进度栏使用不确定模式。不确定模式是进度条的默认模式,它显示循环动画,但未指示特定的进度
这也就是官方的圆形进度条一直在旋转的原因吧
Determinate Progress
如果要显示已发生特定数量的进度,请对进度栏使用确定模式。例如,要检索的文件的剩余百分比,批量写入数据库的记录数量或正在播放的音频文件的剩余百分比。
为了指示确定的进度,您可以将进度条的样式设置为,android.R.style#Widget_ProgressBar_Horizontal并设置进度量
这里说下 android.R.style#Widget_ProgressBar_Horizontal 就是设置样色的时候有2中方式
一种为: style="?android:attr/progressBarStyleHorizontal" 另一种为:style="@android:style/Widget.ProgressBar.Horizontal"
style="?android:attr/progressBarStyleHorizontal" 的方法是系统没有设置style ,背景色之类,等,
style="@android:style/Widget.ProgressBar.Horizontal" 的方法系统设置style,设置进度条背景色,宽度等,
下面是系统的设置 点击code 可以跳转系统设置的style 里面
<style name="Widget.ProgressBar.Horizontal">
<item name="indeterminateOnly">false</item>
<item name="progressDrawable">@drawable/progress_horizontal</item>
<item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal</item>
<item name="minHeight">20dip</item>
<item name="maxHeight">20dip</item>
<item name="mirrorForRtl">true</item>
</style>
progressBar 的xml 属性如下XML属性
android:animationResolution 动画帧之间的超时(以毫秒为单位)。
android:indeterminate 允许启用不确定模式。
android:indeterminateBehavior 定义进度达到最大值时不确定模式应如何表现。
android:indeterminateDrawable 用于不确定模式的Drawable。
android:indeterminateDuration 不确定动画的持续时间。
android:indeterminateOnly 仅限于不确定模式(状态保持进度模式将不起作用)。
android:interpolator 设置不确定动画的加速度曲线。
android:max 定义最大值。
android:maxHeight 一个可选参数,用于为此视图提供最大高度。
android:maxWidth 提供此视图最大宽度的可选参数。
android:min 定义最小值。
android:minHeight 定义最低高度
android:minWidth 定义最低宽度
android:mirrorForRtl 定义在RTL模式下是否需要镜像关联的可绘制对象。
android:progress 定义默认进度值,介于0到最大值之间。
android:progressDrawable 可绘制用于进度模式。
android:secondaryProgress 定义二级进度值,介于0和最大值之间。
下面是使用系统的方法写的几个效果如下
圆形进度条
1 对于圆形进度条 要修改颜色值可以使用下面的方法
android:indeterminateTint="#00d8a0"
如下 这样就修改了系统圆形进度条的颜色了
<ProgressBar
android:layout_width="100dp"
android:layout_height="100dp"
android:indeterminateTint="#00d8a0"
android:indeterminate="false" />
2 圆形动画修改系统的样式 使用的方法 indeterminateDrawable
最下面的菊花就是修改了系统圆形的效果
代码如下
<ProgressBar
android:layout_width="100dp"
android:layout_height="100dp"
android:indeterminateDrawable="@drawable/anim_drawable_bg" />
anim_drawable_bg 的code
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/loading"
android:fromDegrees="0.0"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:toDegrees="360.0" />
这样就是了一个菊花旋转的效果而,
如果要实现特殊的效果建议自定义了
如下的效果
代码参考 我的另一篇博客地址链接
水平进度条
需要设置属性 style="@android:style/Widget.ProgressBar.Horizontal" 或者 style="?android:attr/progressBarStyleHorizontal" 2中方法的区别上面都说了这里就不多说了
上面的进度code 如下
<ProgressBar
android:id="@+id/sys_progress"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginTop="20dp"
android:max="100" />
<ProgressBar
android:id="@+id/hori_progress"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_marginTop="20dp"
android:max="100"
android:progress="0"
android:progressDrawable="@drawable/hori_progress_drawable_bg" />
<ProgressBar
android:id="@+id/send_progress"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginTop="20dp"
android:max="100"
android:progress="50"
android:progressDrawable="@drawable/send_progress_bg"
android:secondaryProgress="70" />
水平进度条需要画几个背景色, 进度条的背景色, 缓冲进度条的背景色(没有这个需求可以不要) 进度条的背景色
<?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" />
<solid android:color="@android:color/holo_green_dark" />
</shape>
</item>
<!-- 缓冲进度条的背景色-->
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dp" />
<solid android:color="@android:color/darker_gray" />
</shape>
</clip>
</item>
<!-- 进度条的背景色-->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dp" />
<solid android:color="@android:color/holo_orange_dark"/>
</shape>
</clip>
</item>
</layer-list>
main code
public class HorizontalActivity extends AppCompatActivity implements Handler.Callback {
private ProgressBar progressBar;
private ProgressBar sysProgressBar;
private ProgressBar send_progress;
private Handler handler;
private int progress = 0;
private int sendProgress = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.horizontal_activity_layout);
progressBar = findViewById(R.id.hori_progress);
sysProgressBar = findViewById(R.id.sys_progress);
send_progress = findViewById(R.id.send_progress);
handler = new Handler(this);
// 循环方法1
handler.postDelayed(new Runnable() {
@Override
public void run() {
handler.postDelayed(this, 50);
handler.sendEmptyMessage(1);
}
}, 0);
// 循环方法2
// new Thread(new Runnable() {
// @Override
// public void run() {
// try {
// //子线程循环间隔消息
// while (progress < 100) {
// Message msg = new Message();
// msg.what = 1;
// handler.sendMessage(msg);
// Thread.sleep(50);
// }
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }).start();
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case 1:
if (progress == 100) {
progress = 0;
sendProgress = 0;
} else {
progress++;
sendProgress = 5 + sendProgress;
}
progressBar.setProgress(progress);
sysProgressBar.setProgress(progress);
send_progress.setProgress(progress);
send_progress.setSecondaryProgress(sendProgress);
break;
}
return false;
}
}
progress 还有几个其他的属性,设置,大小之类的,感觉实用性不强,这里就不列举了,