http://developer.android.com/reference/android/widget/ProgressBar.html#attr_android:indeterminate
一。长形进度条
样式一,Android源码中定义样式style="@android:style/Widget.ProgressBar.Horizontal" 的ui源码
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置背景色 -->
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ff9d9e9d"
android:centerColor="#ff5a5d5a"
android:centerY="0.75"
android:endColor="#ff747674"
android:angle="270"
/>
</shape>
</item>
<!-- 设置过渡进度条颜色 可省略不设置 -->
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#80ffd300"
android:centerColor="#80ffb600"
android:centerY="0.75"
android:endColor="#a0ffcb00"
android:angle="270"
/>
</shape>
</clip>
</item>
<!-- 设置进度条颜色 -->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#ffffd300"
android:centerColor="#ffffb600"
android:centerY="0.75"
android:endColor="#ffffcb00"
android:angle="270"
/>
</shape>
</clip>
</item>
</layer-list>
样式二,Android源码中定义样式style="?android:attr/progressBarStyleHorizontal 的ui源码
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background"
android:drawable="@drawable/progress_bg_holo_dark" />
<item android:id="@android:id/secondaryProgress">
<scale android:scaleWidth="100%"
android:drawable="@drawable/progress_secondary_holo_dark" />
</item>
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%"
android:drawable="@drawable/progress_primary_holo_dark" />
</item>
</layer-list>
自定义ProgressBar:参照样式一修改startColor、centerColor、endColor属性或者参照样式二修改drawable图片在res/drawable目录下创建custom_progressbar_horizontal.xml。
layout文件中引用:通过progressDrawable引用自定义ProgressBar文件
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
style="?android:attr/progressBarStyleHorizontal"
android:progressDrawable="@drawable/custom_progressbar_horizontal"
android:max="100"/>
二。圆形进度条
源码路径:framework/base/core/res/res/values/styles.xml
<style name="Widget.ProgressBar">
<item name="android:indeterminateOnly">true</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_medium_white</item>
<item name="android:indeterminateBehavior">repeat</item>
<item name="android:indeterminateDuration">3500</item>
<item name="android:minWidth">48dip</item>
<item name="android:maxWidth">48dip</item>
<item name="android:minHeight">48dip</item>
<item name="android:maxHeight">48dip</item>
</style>
其中progress_medium_white的路径:framework/base/core/res/res/drawable/progress_medium_white.xml
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/spinner_white_48"
android:pivotX="50%"
android:pivotY="50%"
android:framesCount="12"
android:frameDuration="100" />
其中android:framesDuration 跟 android:frameDuration 是内部属性,外部应用不能直接使用。但是还是可以参照上面的源码来自定义圆形样式。
首先介绍三种自定义圆形进度条的方式
1.通过动画实现
定义res/anim/loading.xml
<animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:duration="150" android:drawable="@drawable/load_1" />
<item android:duration="150" android:drawable="@drawable/load_3" />
<item android:duration="150" android:drawable="@drawable/load_5" />
<item android:duration="150" android:drawable="@drawable/load_7" />
<item android:duration="150" android:drawable="@drawable/load_9" />
<item android:duration="150" android:drawable="@drawable/load_11" />
<item android:duration="150" android:drawable="@drawable/load_13" />
<item android:duration="150" android:drawable="@drawable/load_15" />
</animation-list>
在layout中的引用
<ProgressBar
android:layout_width="84dp"
android:layout_height="84dp"
android:indeterminate="false"
android:indeterminateDrawable="@anim/loading"/>
2.通过自定义颜色实现
定义res/drawable/dialog_style_xml_color.xml
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:pivotX="50%"
android:pivotY="50%"
android:duration="90"
android:fromDegrees="0"
android:toDegrees="360">
<shape android:shape="ring"
android:innerRadiusRatio="3"
android:thicknessRatio="8"
android:useLevel="false">
<gradient
android:type="sweep"
android:useLevel="false"
android:startColor="#FFFFFF"
android:centerColor="#FFDC35"
android:centerY="0.50"
android:endColor="#CE0000"
/>
</shape>
</rotate>
在layout中的引用
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="false"
android:indeterminateDrawable="@drawable/dialog_style_xml_color" />
3.通过旋转图片实现
定义res/drawable/dialog_style_xml_icon.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<rotate
android:drawable="@drawable/ic_launcher"
android:fromDegrees="0.0"
android:pivotX="50.0%"
android:pivotY="50.0%"
android:toDegrees="360.0" />
</item>
</layer-list>
在layout中引用
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="false"
android:indeterminateDrawable="@drawable/dialog_style_xml_icon"/>
转载一篇圆形进度条实际运用
// UI线程里初始化
- mProgressBar = new ProgressBar(AppConfig.getContext());
- FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
- LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
- // 居中
- params.gravity = Gravity.CENTER;
- AppConfig.getMainActivity().addContentView(mProgressBar, params);
- mProgressBar.setVisibility(View.INVISIBLE);
mProgressBar = new ProgressBar(AppConfig.getContext());
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
// 居中
params.gravity = Gravity.CENTER;
AppConfig.getMainActivity().addContentView(mProgressBar, params);
mProgressBar.setVisibility(View.INVISIBLE);
// handler里回调 显示 | 隐藏
- case MSG_PROGRESSBAR_SHOW:
- mProgressBar.setVisibility(View.VISIBLE);
- break;
- case MSG_PROGRESSBAR_HIDE:
- // 多次请求时,只响应第一个HIDE消息
- mHandler.removeMessages(MSG_PROGRESSBAR_SHOW);
- mProgressBar.setVisibility(View.INVISIBLE);
- break;
case MSG_PROGRESSBAR_SHOW:
mProgressBar.setVisibility(View.VISIBLE);
break;
case MSG_PROGRESSBAR_HIDE:
// 多次请求时,只响应第一个HIDE消息
mHandler.removeMessages(MSG_PROGRESSBAR_SHOW);
mProgressBar.setVisibility(View.INVISIBLE);
break;
// 重画Progressbar的进度
1.indeterminate mode | 没有具体进度的进度条
1.1 定制动画文件
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateDrawable="@drawable/progress_my_style"
style="?android:attr/progressBarStyle"
/>
注:style="?android:attr/progressBarStyle" 这是默认样式 ,可换改
step2: 在drawable文件夹下建立progress_my_style.xml文件:内容可如下:
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/spinner_color"
android:pivotX="50%"
android:pivotY="50%"
/>
注意:
1. android:drawable="@drawable/spinner_color" 这里,你需要在drawable下建立spinner_color.png图片(自己画成你所想到的效果(渐变))
2. progress_my_style.xml文件内容参考至D:\andrirod\android-sdk-windows\platforms\android-7\data\res\drawable\ progress_medium_white.xml文件内容,(android:framesCount与android:frameDuratiion是frameworks内部的属性,无法直接使用,所以省略)
以上是在XML中直接定义,下面是我在代码里直接定义的:
- mProgressBar.setIndeterminateDrawable(AppConfig.getResources().getDrawable(R.drawable.style_common_processbar));
mProgressBar.setIndeterminateDrawable(AppConfig.getResources().getDrawable(R.drawable.style_common_processbar));
style_common_processbar.xml还是需要定义在xml里的
- <?xml version="1.0" encoding="UTF-8"?>
- <animated-rotate
- android:drawable="@drawable/icon"
- android:pivotX="50.0%"
- android:pivotY="50.0%"
- xmlns:android="http://schemas.android.com/apk/res/android">
- </animated-rotate>
<?xml version="1.0" encoding="UTF-8"?> <animated-rotate android:drawable="@drawable/icon" android:pivotX="50.0%" android:pivotY="50.0%" xmlns:android="http://schemas.android.com/apk/res/android"> </animated-rotate>
结果是就是用图片icon旋转来表示进度,图片制作参考 android的 drawable_hdpi 下的 spinner_black_48.png
1.2 定制颜色和形状
利用shape来定制颜色和形状
- // 定制模式
- mProgressBar.setIndeterminateDrawable(AppConfig.getResources().getDrawable(R.drawable.style_common_processbar));
// 定制模式 mProgressBar.setIndeterminateDrawable(AppConfig.getResources().getDrawable(R.drawable.style_common_processbar));
style_common_processbar.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <rotate
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="30"
- android:fromDegrees="0.0"
- android:toDegrees="360.0"
- android:pivotX="50.0%"
- android:pivotY="50.0%"
- android:repeatCount="infinite">
- <shape
- android:shape="ring"
- android:innerRadiusRatio="3.2"
- android:thicknessRatio="5.333"
- android:useLevel="false">
- <size
- android:height="16.0dip"
- android:width="16.0dip" />
- <gradient
- android:startColor="#4cffffff"
- android:endColor="#ffff0000"
- android:useLevel="false"
- android:type="sweep"
- android:centerY="0.5"
- android:centerColor="#4cffffff" />
- </shape>
- </rotate>
<?xml version="1.0" encoding="UTF-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="30" android:fromDegrees="0.0" android:toDegrees="360.0" android:pivotX="50.0%" android:pivotY="50.0%" android:repeatCount="infinite"> <shape android:shape="ring" android:innerRadiusRatio="3.2" android:thicknessRatio="5.333" android:useLevel="false"> <size android:height="16.0dip" android:width="16.0dip" /> <gradient android:startColor="#4cffffff" android:endColor="#ffff0000" android:useLevel="false" android:type="sweep" android:centerY="0.5" android:centerColor="#4cffffff" /> </shape> </rotate>
通过修改
android:shape=["rectangle" | "oval" | "line" | "ring"] 来修改形状
gradient来修改颜色属性
2.progress mode | 有百分比进度的进度条
代码调用:mProgressBar.setProgressDrawable(AppConfig.getResources().getDrawable(R.drawable.color));
color.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" android:drawable="@drawable/bg" />
- <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/secondary" />
- <item android:id="@android:id/progress" android:drawable="@drawable/progress" />
- </layer-list>
<?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background" android:drawable="@drawable/bg" /> <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/secondary" /> <item android:id="@android:id/progress" android:drawable="@drawable/progress" /> </layer-list>