Android 自定义进度条实现以及属性动画实现

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()函数中,组件还未创建完成,所以无法得到宽度,于是我创建了全局响应事件,解决了问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值