1.自定义进度条
自定义属性值
由于Android Studio自带了进度条,但是其进度条往往是最普通的且很多情况下达不到我们的预期效果,所有我们需要自定义属性值去给进度条一个样式。
在styles里先创建自己的自定义属性
<style name="MyProgressbar" parent="@android:style/Widget.ProgressBar.Horizontal">
<item name="android:maxHeight">50dp</item>
<item name="android:minHeight">10dp</item>
<item name="android:indeterminateOnly">false</item>//进度值是否唯一确定
<item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>//设置绘制不显示进度的进度条的Drawable对象
<item name="android:progressDrawable">@drawable/progress_selfstyle</item>//属性设置文件
</style>
然后通过layer-in和shape自定义好自己的进度条的渐变颜色、边缘圆角等属性
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/background">
<shape>
<corners android:radius="0dp" />//设置圆角半径
<gradient //设置渐变色
android:angle="90"
android:endColor="#e1e0e0"//变化的右方的(即结束后)颜色
android:startColor="#e1e0e0"/>//变化左方(即结束前)颜色
</shape>
</item>
<item android:id="@+id/progress">
<clip>
<scale
android:scaleWidth="100%"//设置缩放百分比
android:drawable="@drawable/progress_shape1"/>
</clip>
</item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="0dp" />
<gradient
android:angle="0"
android:endColor="#6a6d6e"
android:startColor="#979999"/>
</shape>
自定义好属性之后直接使用即可,就是在定义进度条时直接用style引入
<ProgressBar
android:id="@+id/progress_length"
style="@style/MyProgressbar"
android:layout_width="670dp"
android:layout_height="25dp"
android:layout_centerInParent="true"
android:max="100"
android:maxHeight="50dp"
android:minHeight="16dp"
/>
进度条动态进度实现
由于进度条进度属于后台更新进度,而且由于android的特性,我们无法在子线程直接对主视图修改,所以我在子线程里更新进度,通过Handler-Message机制对主视图更新。
new Thread() {
public void run() {
while (status < 100) {
status = doWork();
mHandler.sendEmptyMessage(status);
try {
Thread.sleep(100); // 暂停要放在通知主线程之后,因为计算进度和更新UI同属一个周期
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what <= 100) {
bar.setProgress(status);
}
};
2.属性动画运用实现动态进度
属性动画基础知识
属性动画与视图动画区别:ObjectAnimator,相比于谷歌之前提出的View AnimTion, ObjectAnimator做的更加完美,View AnimTion是将组件进行重绘完成移动、透明、旋转等操作,而不能将伏与其上的点击事件等带到变换后的组件上,这使得View AnimTion在做交互动画时变得异常困难,而属性动画是直接对组建的属性也就是位置等元素进行操作,当然不会出现对象已经移动,而你点击原来位置还可以触发点击事件的现象,可以说很好用。
我的思路实在子线程里获取进度条的进度,然后同时根据进度以及进度条试图位置第一动画的起始值,直接用ObjectAnimator.ofFloat进行平移
具体实现
//实时确定起始位置
dation = (int) (Math.random() * 5); // dation是前进百分比
Log.i(TAG, "dation:" + dation);
data += dation;
if(data>100){
dation = dation - (data - 100);
data = 100;
}
if (caculate_time == 0) {
start_x = 0;
end_x = (width * dation / bar.getMax());
} else {
start_x = end_x;
end_x = end_x + (width * dation / bar.getMax()); // image的终止位置,应该是当前位置 + 刻度条长度 * 前进百分比
}
//动画开始
animator = ObjectAnimator.ofFloat(imageView, "translationX", (float) start_x, (float) end_x);
animator.setDuration(0);
animator.start();
在最初的动画中,我发现用view.getWidth(),是无法在onCreat()中得到宽度的,原来在onCreat()函数中,组件还未创建完成,所以无法得到宽度,于是我创建了全局响应事件,解决了问题。