Android ProgressBar 控件使用

Love The Way You Lie 2024-04-01 11:56 166阅读 0赞

1. 前言

进度条是UI界面中一种非常实用的组件,通常用于向用户显示某个耗时操作完成的百分比,进度条可以动态的显示进度,因为避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应,从而更好地提高用户界面的友好性。

进度条展示有两种:水平进度条 和 环形进度条 ,下文分别详细介绍。首先我们来看下进度条的相关属性介绍。

2. ProgressBar属性介绍

2.1 XML属性

c67358fab78b42f7a0b0effbac32ef62.png 这里的andorid:progressDrawable用于指定进度条的轨道的绘制形式,该属性可以指定为一个LayerDrawble对象的引用(该对象可以在XML文件中使用元素来进行配置)。

android:indeterminateBehavior

定义当进度达到最大时,不确定模式的表现;该值必须为repeat或者cycle,repeat表示进度从0重新开始;cycle表示进度保持当前值,并且回到0
android:indeterminateDuration=“500”,每转一圈的时间,ms

2.2 API属性

当然ProgressBar也提供如下方法来操作进度条:

  1. setProgress(int) //设置第一进度
  2. setSecondaryProgress(int) //设置第二进度
  3. getProgress() //获取第一进度
  4. getSecondaryProgress() //获取第二进度
  5. incrementProgressBy(int) //增加或减少第一进度, 当参数为正数时,进度条增加,当参数为负数时,进度条减少
  6. incrementSecondaryProgressBy(int) //增加或减少第二进度
  7. getMax() //获取最大进度

3. 水平进度条

在xml中引用有两种方式:

A为 style=”?android:attr/progressBarStyleHorizontal”

B为 style=”@android:style/Widget.ProgressBar.Horizontal”

查看B的源码,相关属性为:

  1. <style name="Widget.ProgressBar.Horizontal">
  2. <item name="indeterminateOnly">false</item>
  3. <item name="progressDrawable">@drawable/progress_horizontal</item>
  4. <item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal</item>
  5. <item name="minHeight">20dip</item>
  6. <item name="maxHeight">20dip</item>
  7. <item name="mirrorForRtl">true</item>
  8. </style>

上文中提到的progressDrawable就是水平进度条轨迹的显示Drawable。我们继续去看下progress_horizontal 的源码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!-- 进度条的背景色-->
  4. <item android:id="@android:id/background">
  5. <shape>
  6. <corners android:radius="5dip" />
  7. <gradient
  8. android:startColor="#ff9d9e9d"
  9. android:centerColor="#ff5a5d5a"
  10. android:centerY="0.75"
  11. android:endColor="#ff747674"
  12. android:angle="270"
  13. />
  14. </shape>
  15. </item>
  16. <!-- 缓冲进度条的背景色-->
  17. <item android:id="@android:id/secondaryProgress">
  18. <clip>
  19. <shape>
  20. <corners android:radius="5dip" />
  21. <gradient
  22. android:startColor="#80ffd300"
  23. android:centerColor="#80ffb600"
  24. android:centerY="0.75"
  25. android:endColor="#a0ffcb00"
  26. android:angle="270"
  27. />
  28. </shape>
  29. </clip>
  30. </item>
  31. <!-- 下载过程中进度条的颜色-->
  32. <item android:id="@android:id/progress">
  33. <clip>
  34. <shape>
  35. <corners android:radius="5dip" />
  36. <gradient
  37. android:startColor="#ffffd300"
  38. android:centerColor="#ffffb600"
  39. android:centerY="0.75"
  40. android:endColor="#ffffcb00"
  41. android:angle="270"
  42. />
  43. </shape>
  44. </clip>
  45. </item>
  46. </layer-list>

上述代码就是一个 LayerDrawble图片,它是层次化的Drawable合集, 根元素为 ,每一个item就是一个shape图片,最后一个item显示在最上层。

4. 圆形进度条

系统自带的圆形进度条,都是一直转圈状态,为不精确显示进度 默认android:indeterminate属性值为true 。

d870130bc98a45c8825ab3ad3d614426.png

我们进去 android:style/Widget.ProgressBar.Large源码看下

  1. <style name="Widget.ProgressBar.Large">
  2. <item name="indeterminateDrawable">@drawable/progress_large_white</item>
  3. <item name="minWidth">76dip</item>
  4. <item name="maxWidth">76dip</item>
  5. <item name="minHeight">76dip</item>
  6. <item name="maxHeight">76dip</item>
  7. </style>

就是一个indeterminateDrawable ,进去再看下代码:

  1. <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:drawable="@drawable/spinner_white_76"
  3. android:pivotX="50%"
  4. android:pivotY="50%"
  5. android:framesCount="12"
  6. android:frameDuration="100" />

看看 spinner_white_76 这个图片:feb8b38589724a7a82151d95d0023605.png 是一个 rotate 动画效果。

  1. 我们来修改一下系统圆形进度条的颜色,修改属性为:android:indeterminateTint=”#ff0000”

源码注释:Tint to apply to the indeterminate progress indicator 翻译:就是给进度条着色

代码:

  1. <ProgressBar
  2. android:layout_height="wrap_content"
  3. android:layout_width="wrap_content"
  4. android:indeterminateTint="#ff0000"/>

没加这句话是默认灰色圆形进度条, 加了之后就变成了红色圆形进度条。

  1. 自定义转圈动画

bg_loading.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <item>
  4. <rotate
  5. android:drawable="@drawable/loading"
  6. android:fromDegrees="0.0"
  7. android:pivotX="50.0%"
  8. android:pivotY="50.0%"
  9. android:toDegrees="359.0"
  10. android:repeatMode="reverse"/>
  11. </item>
  12. </layer-list>

loading.xml : ca81377200c04bedb38d21e758a81755.png

5. 实例演示

我们来写一个水平进度条,模拟下载任务进度过程:

  1. public class MainActivity extends AppCompatActivity {
  2. private ProgressBar horizontalProgress;
  3. private ProgressBar circleProgress;
  4. private Button startBtn;
  5. private TextView mTextView;
  6. private Handler mHandler = new Handler(){
  7. @Override
  8. public void handleMessage(@NonNull Message msg) {
  9. super.handleMessage(msg);
  10. if(msg.what >= 100) {
  11. horizontalProgress.setProgress(100);
  12. mTextView.setText("下载完成");
  13. removeCallbacksAndMessages(null);
  14. return;
  15. }
  16. int progress = msg.what;
  17. horizontalProgress.setProgress(progress);
  18. mTextView.setText("下载进度:" + progress + "%");
  19. Message message = Message.obtain();
  20. int temp = progress + 4;
  21. message.what = temp;
  22. mHandler.sendMessageDelayed(message, 1000);
  23. }
  24. };
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29. horizontalProgress = findViewById(R.id.progressbar1);
  30. mTextView = findViewById(R.id.tv_progress);
  31. circleProgress = findViewById(R.id.progressbar2);
  32. startBtn = findViewById(R.id.start_download);
  33. }
  34. @Override
  35. protected void onResume() {
  36. super.onResume();
  37. startBtn.setOnClickListener(new View.OnClickListener() {
  38. @Override
  39. public void onClick(View v) {
  40. Message msg = Message.obtain();
  41. msg.what = 1;
  42. mHandler.sendMessage(msg);
  43. startBtn.setClickable(false);
  44. }
  45. });
  46. }
  47. @Override
  48. protected void onDestroy() {
  49. super.onDestroy();
  50. mHandler.removeCallbacksAndMessages(null);
  51. }

布局文件activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:layout_marginLeft="8dp"
  6. android:layout_marginRight="8dp"
  7. android:gravity="center"
  8. android:orientation="vertical">
  9. <TextView
  10. android:id="@+id/tv_progress"
  11. android:layout_height="wrap_content"
  12. android:layout_width="wrap_content"
  13. android:text="水平进度条"
  14. android:textSize="20sp" />
  15. <ProgressBar
  16. style="@android:style/Widget.ProgressBar.Horizontal"
  17. android:id="@+id/progressbar1"
  18. android:layout_height="15dp"
  19. android:layout_width="match_parent"
  20. android:progress="0"
  21. android:max="100"/>
  22. <TextView
  23. android:id="@+id/tv_progress2"
  24. android:layout_height="wrap_content"
  25. android:layout_marginTop="8dp"
  26. android:layout_width="wrap_content"
  27. android:text="圆形进度条"
  28. android:textSize="20sp" />
  29. <ProgressBar
  30. android:id="@+id/progressbar2"
  31. android:layout_height="wrap_content"
  32. android:layout_width="wrap_content"
  33. android:indeterminateDrawable="@drawable/bg_loading"
  34. />
  35. <Button
  36. android:layout_height="wrap_content"
  37. android:layout_width="wrap_content"
  38. android:id="@+id/start_download"
  39. android:textSize="20sp"
  40. android:text="开始下载"/>

演示效果图:

da9cff78a0b840ec81142edba72321c9.gif

发表评论

表情:
评论列表 (有 0 条评论,166人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ProgressBar入门

            ProgressBar进度条在实际开发中,很是常用,任何耗时操作都会使用进度条来告诉用户,这里会话费一点时间,请耐心等待。 废话不多说,直接上代码。