ProgressBar简介

继承于View类,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar,可见这二者也是基于ProgressBar实现的。

1、ProgressBar有两个进度,一个是Android:progress,另一个是android:secondaryProgress。后者主要是为缓存需要所涉及的,比如在看网络视频时候都会有一个缓存的进度条以及还要一个播放的进度,在这里缓存的进度就可以是android:secondaryProgress,而播放进度就是android:progress,有了secondProgress,可以很方便定制ProgressBar。

2、ProgressBar分为确定的和不确定的,确定的是我们能明确看到进度,相反不确定的就是不清楚、不确定一个操作需要多长时间来完成,这个时候就需要用的不确定的ProgressBar了。属性android:indeterminate如果设置为true的话,那么ProgressBar就可能是圆形的滚动条或者水平的滚动条(由样式决定),但是我们一般时候,是直接使用Style类型来区分圆形还是水平ProgressBar的。

3、ProgressBar的样式设定其实有两种方式,在API文档中说明的方式如下:

  • Widget.ProgressBar.Horizontal
  • Widget.ProgressBar.Small
  • Widget.ProgressBar.Large
  • Widget.ProgressBar.Inverse
  • Widget.ProgressBar.Small.Inverse
  • Widget.ProgressBar.Large.Inverse

使用的时候可以这样:style="@android:style/Widget.ProgressBar.Small",另外还有一种方式就是使用系统的attr,下面的方式是系统的style:

  • style="?android:attr/progressBarStyle"
  • style="?android:attr/progressBarStyleHorizontal"
  • style="?android:attr/progressBarStyleInverse"
  • style="?android:attr/progressBarStyleLarge"
  • style="?android:attr/progressBarStyleLargeInverse"
  • style="?android:attr/progressBarStyleSmall"
  • style="?android:attr/progressBarStyleSmallInverse"
  • style="?android:attr/progressBarStyleSmallTitle"
  1. <ProgressBar
  2. android:id="@+id/progressBar1"
  3. style="?android:attr/progressBarStyleHorizontal"
  4. style="@android:style/Widget.ProgressBar.Horizontal"(等同于@android:attr)
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content" />

水平ProgressBar系统样式

我们去看一下style="?android:attr/progressBarStyleHorizontal"的源码,如下:

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

一眼看出android:progressDrawable便是主角,继续看一下progress_horizontal的源码,如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- Copyright (C) 2008 The Android Open Source Project
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. -->
  13. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  14. <item android:id="@android:id/background">
  15. <shape>
  16. <corners android:radius="5dip" />
  17. <gradient
  18. android:startColor="#ff9d9e9d"
  19. android:centerColor="#ff5a5d5a"
  20. android:centerY="0.75"
  21. android:endColor="#ff747674"
  22. android:angle="270"
  23. />
  24. </shape>
  25. </item>
  26. <item android:id="@android:id/secondaryProgress">
  27. <clip>
  28. <shape>
  29. <corners android:radius="5dip" />
  30. <gradient
  31. android:startColor="#80ffd300"
  32. android:centerColor="#80ffb600"
  33. android:centerY="0.75"
  34. android:endColor="#a0ffcb00"
  35. android:angle="270"
  36. />
  37. </shape>
  38. </clip>
  39. </item>
  40. <item android:id="@android:id/progress">
  41. <clip>
  42. <shape>
  43. <corners android:radius="5dip" />
  44. <gradient
  45. android:startColor="#ffffd300"
  46. android:centerColor="#ffffb600"
  47. android:centerY="0.75"
  48. android:endColor="#ffffcb00"
  49. android:angle="270"
  50. />
  51. </shape>
  52. </clip>
  53. </item>
  54. </layer-list>

这里面有3个item,分别为:background、secondProgress、progress,看名字就能知道其大概作用,我们比较关心的应该是后两个,其实把这个文件copy一份到自己的项目下,就可以随心所欲的修改shape属性:圆角、渐变等等。

自定义水平ProgressBar

第一步,在drawable文件夹下新建一个progressbar_horizontal_1.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <!-- background -->
  4. <item
  5. android:id="@android:id/background"
  6. android:drawable="@drawable/progress_patch_green">
  7. </item>
  8. <!-- progress -->
  9. <item android:id="@android:id/progress">
  10. <clip>
  11. <nine-patch android:src="@drawable/progress_patch_galy" />
  12. </clip>
  13. </item>
  14. <!-- second progress -->
  15. <item android:id="@android:id/secondaryProgress">
  16. <clip>
  17. <nine-patch android:src="@drawable/progresspatch_blue" />
  18. </clip>
  19. </item>
  20. </layer-list>

上图中的progress和secondprogress中src的资源便是我自定义的,注意这三个之间的叠放顺序,background是最底层,中间的是progress最上层是second。

第二步,标准一点,在style中新建我们自定义的style:mProgress_horizontal:

  1. <style name="mProgress_horizontal">
  2. <item name="android:indeterminateOnly">false</item>
  3. <item name="android:progressDrawable">@drawable/progressbar_horizontal_1</item><!-- progress_horizontal -->
  4. <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
  5. <item name="android:minHeight">20dip</item>
  6. <item name="android:maxHeight">20dip</item>
  7. </style>

上图中prpgressDrawable资源便是指向了我们自定义的progressbar_horizontal_1,大功告成。

第三步,组件引用:

  1. <ProgressBar
  2. android:id="@+id/progressBar1"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:background="@drawable/progress_backround"
  6. android:padding="5dp"
  7. android:progress="50"
  8. style="@style/mProgress_horizontal"
  9. android:secondaryProgress="20"
  10. android:visibility="visible" />

【附】

在这里我们也可以省略第二步创建style,直接在组件中android:progressDrawable引用自己的progressbar_horizontal_1,如下:

  1. <ProgressBar
  2. android:id="@+id/progressBar1"
  3. android:indeterminate="false"
  4. android:indeterminateOnly="false"
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content"
  7. android:background="@drawable/progress_backround"
  8. android:padding="5dp"
  9. android:progress="50"
  10. android:maxHeight="20dp"
  11. android:minHeight="20dp"
  12. android:progressDrawable="@drawable/progressbar_horizontal_1"
  13. android:secondaryProgress="20"
  14. />

第四步,效果图:

圆形ProgressBar系统样式

  1. <ProgressBar
  2. android:id="@+id/progressBar2"
  3. style="@android:attr/progressBarStyleLarge"
  4. android:layout_gravity="center_vertical"
  5. android:layout_width="match_parent"
  6. android:layout_height="wrap_content" />

我们以progressBarStyleLarge为例进行探索,找到这个布局文件,源码如下:

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

同样一眼看出indeterminateDrawable便是主角了,继续看一下progress_large_white源码,如下:

  1. <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:fromDegrees="0"
  6. android:toDegrees="360" />

看到这里就透彻了,就是在这里spinner_white_76进行不停的旋转的,我们copy一下这个文件,就可以直接自定义了。

自定义圆形ProgressBar

第一步,在drawable文件夹下新建:progressbar_circle_1.xml,如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <rotate xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:drawable="@drawable/loading" //自定义的菊花图片
  4. android:fromDegrees="0"
  5. android:pivotX="50%"
  6. android:pivotY="50%"
  7. android:toDegrees="360" >
  8. </rotate>

第二步,在Style中定义mProgress_circle,如下:

  1. <style name="mProgress_circle">
  2. <item name="android:indeterminateDrawable">@drawable/progressbar_circle_1</item>
  3. <item name="android:minWidth">25dp</item>
  4. <item name="android:minHeight">25dp</item>
  5. <item name="android:maxWidth">60dp</item>
  6. <item name="android:maxHeight">60dp</item>
  7. </style>

支持大小自己随意定,别失真就好

第三步,组件中引用,如下:

  1. <ProgressBar
  2. android:id="@+id/progressBar2"
  3. style="@style/mProgress_circle"
  4. android:layout_gravity="center_vertical"
  5. android:layout_width="match_parent"
  6. android:indeterminateDuration="1200"
  7. android:layout_height="wrap_content" />

【附】
上面是通过一张图片填充android:indeterminateDrawable,我们也可以定义一个动画或者自定义颜色(shape)来实现,跟图片的用法一样:

定义动画 progress_circle_loading,xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <animation-list android:oneshot="false"
  3.   xmlns:android="http://schemas.android.com/apk/res/android">
  4.   <item android:duration="100" android:drawable="@drawable/loading_1" />
  5.   <item android:duration="100" android:drawable="@drawable/loading_2" />
  6.   <item android:duration="100" android:drawable="@drawable/loading_3" />
  7.   <item android:duration="100" android:drawable="@drawable/loading_4" />
  8.   <item android:duration="100" android:drawable="@drawable/loading_5" />
  9.   <item android:duration="100" android:drawable="@drawable/loading_6" />
  10. </animation-list>

style的indeterminateDrawable引入:

  1. <pre name="code" class="java"><item name="android:indeterminateDrawable">@drawable/progress_circle_loading</item>

定义shape颜色 progress_circle_shape.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <rotate xmlns:android="http://schemas.android.com/apk/res/android"
  3.   android:fromDegrees="0"
  4.   android:pivotX="50%"
  5.   android:pivotY="50%"
  6.   android:toDegrees="360" >
  7.   <shape
  8.     android:innerRadiusRatio="3"
  9.     android:shape="ring"
  10.     android:thicknessRatio="8"
  11.     android:useLevel="false" >
  12.     <gradient
  13.       android:centerColor="#FFFFFF"
  14.       android:centerY="0.50"
  15.       android:endColor="#1E90FF"
  16.       android:startColor="#000000"
  17.       android:type="sweep"
  18.       android:useLevel="false" />
  19.   </shape>
  20. </rotate>

style的indeterminateDrawable引入:

  1. <item name="android:indeterminateDrawable">@drawable/progress_circle_shape</item>

效果图如下:

SeekBar的原理是一样的,不信你看下图,我就是用的seekbar

最后来张全家福:

Android简单自定义圆形和水平ProgressBar的更多相关文章

  1. 【Android进度条】三种方式实现自定义圆形进度条ProgressBar

    一.通过动画实现 定义res/anim/loading.xml如下: <?xml version="1.0" encoding="UTF-8"?> ...

  2. Android 三种方式实现自定义圆形进度条ProgressBar

    一.通过动画实现 定义res/anim/loading.xml如下: <?xml version="1.0" encoding="UTF-8"?> ...

  3. Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View

    一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...

  4. Android 自定义View修炼-实现自定义圆形、圆角和椭圆ImageView(使用Xfermode图形渲染方法)

    一:简介: 在上一篇<Android实现圆形.圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)>博文中,采用BitmapShader方法实现自定义的圆形.圆角等自定 ...

  5. android圆形进度条ProgressBar颜色设置

    花样android Progressbar http://www.eoeandroid.com/thread-1081-1-1.html http://www.cnblogs.com/xirihanl ...

  6. Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸

    Android特效专辑(五)--自定义圆形头像和仿MIUI卸载动画-粒子爆炸 好的,各位亲爱的朋友,今天讲的特效还是比较炫的,首先,我们会讲一个自定义圆形的imageView,接着,我们会来实现粒子爆 ...

  7. 自定义圆形的ProgressBar

    1.自定义圆形的ProgressBar 效果图: 圆形ProgressBar的样式主要有以下几个,我们这里以progressBarStyleLarge为例进行样式的修改,其他的类似. <Prog ...

  8. Android 自定义圆形图片 CircleImageView

    1.效果预览 1.1.布局中写自定义圆形图片的路径即可 1.2.然后看一看图片效果 1.3.原图是这样的 @mipmap/ic_launcher 2.使用过程 2.1.CircleImageView源 ...

  9. 带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变

    带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变 转 https://blog.csdn.net/qq_30993595/article/details/78915115   近期有 ...

随机推荐

  1. 整数划分问题-解法汇总(暂有DP-递归)

    整数划分问题是一个锻炼组合数学,递归以及动态规划很好的例子,虽然问题看似简单,但是其中玄机万千,有人转化成为背包问题,有人用生成函数解,有人以此作为企业面试题目,可见这种问题的认可度还是很高的. 整数 ...

  2. 让最新官方编译的 ffmpeg 在 XP 上 跑起来

    下载 fix-ffmpeg-bin.7z , 解压到 ffmpeg 的 bin 目录下, 运行 fixff.cmd 即可. fix-ffmpeg-bin.7z FT ft[]={ {"_wf ...

  3. Java中的Comparable接口和Comparator接口

    Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个 ...

  4. 数据结构——二叉查找树、AVL树

    二叉查找树:由于二叉查找树建树的过程即为插入的过程,所以其中序遍历一定为升序排列! 插入:直接插入,插入后一定为根节点 查找:直接查找 删除:叶子节点直接删除,有一个孩子的节点删除后将孩子节点接入到父 ...

  5. a byte of python(摘03)

    a byte of python 第七章 模块 想要在其他程序中重用很多函数,那么你该如何编写程序呢? 答案是使用模块. 模块基本上就是一个包含了所有你定义的函数和变量的文件.为了在其他程序中重用模块 ...

  6. CODE VS1008选数

    #include<cstdlib> #include<cstdio> #include<iostream> #include<cmath> #inclu ...

  7. Android 中沉浸式状态栏实现

    Android 中沉浸式状态栏实现方式如下 计算状态栏高度及调用沉浸式状态栏的相关API方法 package com.example.status; import android.annotation ...

  8. 【python】入门学习(十)

    #入门学习系列的内容均是在学习<Python编程入门(第3版)>时的学习笔记 统计一个文本文档的信息,并输出出现频率最高的10个单词 #text.py #保留的字符 keep = {'a' ...

  9. 【python】类中的self

    在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...

  10. Hibernate创建hqll时报错

    Hibernate 问题,在执行Query session.createQuery(hql) 报错误 出错截图: 这条语句在java运行环境下,直接连数据库不出错,如果在hiberante,strut ...