android propertyAnimator--()

本文介绍了在Android中简化动画实现的两种方法:propertyValueHolder和ViewPropertyAnimator。通过使用这些工具,开发者可以更简便地为View对象设置多个属性动画,如改变Alpha值、缩放比例等,并且可以利用KeyFrame类来控制动画的关键帧,实现更加灵活的效果。此外,文章还展示了如何使用XML文件来控制动画,以及如何将动画与View对象关联起来。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android 当对象有多个属性的话,或者要实现的动画比较复杂,需要对View的多个属性进行动画,那么,按照之前的做法就是需要创建多个ValueAnimator或者ObjectAnimator,然后把他们放在AnimatorSet中,这样就显得冗余繁琐。

android 给了其他的解决方案:

propertyValueHolder  针对所有对象

// 将showbutton 做成呼吸按钮的动画
        // 变小,变淡------变大,显示
        PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
        PropertyValuesHolder scaleXHolder = PropertyValuesHolder.ofFloat("scaleX", 1f, 0.5f, 0.1f,
                0.5f, 1f);
        PropertyValuesHolder scaleYHolder = PropertyValuesHolder.ofFloat("scaleY", 1f, 0.5f, 0.1f,
                0.5f, 1f);
        ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(showButton,
                alphaHolder, scaleXHolder, scaleYHolder).setDuration(3000);
        objectAnimator.setRepeatCount(ObjectAnimator.INFINITE);
        objectAnimator.start();


ViewPropertyAnimator

如果要同时变换一个View的多个属性的话,ViewPropertyAnimator提供了一种更方便和更适合的方法。

而且由于多个属性的invalidate方法调用统一管理,而不是之前的分别调用,所以还会有一些性能优化。

注意 ViewPropertyAnimator 这个类的对象不是由调用者构造的,而是通过View类的animate()方法返回的。

该类是多属性动画,从名字就可以看出该类的作用对象是view,当一个view对象需要同时执行多个属性动画的时候就可以考虑使用该类了。比如说:一个ImageView先右移动的同时进行放大一倍的动画效果实现如下:

<span style="white-space:pre">	</span>myView.animate().x(50f).y(100f);

KeyFrame

这个类是通过控制time/value键值对来实现动画效果的。Keyframe类里面实现的 ofInt,ofFloat,ofObject方法。来看看ofFloat(float fraction, float value)第一个参数表示动画完成度,值在0—1之间变化。第二个参数表示当前帧动画的值。还不明白那就来点简单粗暴的吧。动画向右平移200个像素之后又移动回原来位置的动画
<span style="white-space:pre">	</span>Keyframe keyframe1 = Keyframe.ofFloat(0f, 0f);
        Keyframe keyframe2 = Keyframe.ofFloat(0.9999f, 360f);
        Keyframe keyframe3 = Keyframe.ofFloat(1f, 0f);
        PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofKeyframe("rotation",
                keyframe1, keyframe2, keyframe3);
        ObjectAnimator change_disappearingAnimator = ObjectAnimator.ofPropertyValuesHolder(this,
                pvh_left, pvh_top, pvh_right, pvh_buttom, propertyValuesHolder).setDuration(
                xmlTransition.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
        xmlTransition
                .setAnimator(LayoutTransition.CHANGE_DISAPPEARING, change_disappearingAnimator);

当然我们也可以利用xml文件来控制动画。比如:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially" >

    <objectAnimator
        android:duration="2000"
        android:propertyName="translationX"
        android:valueFrom="-500"
        android:valueTo="0"
        android:valueType="floatType" >
    </objectAnimator>

    <set android:ordering="together" >
        <objectAnimator
            android:duration="3000"
            android:propertyName="rotation"
            android:valueFrom="0"
            android:valueTo="360"
            android:valueType="floatType" >
        </objectAnimator>

        <set android:ordering="sequentially" >
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="1"
                android:valueTo="0"
                android:valueType="floatType" >
            </objectAnimator>
            <objectAnimator
                android:duration="1500"
                android:propertyName="alpha"
                android:valueFrom="0"
                android:valueTo="1"
                android:valueType="floatType" >
            </objectAnimator>
        </set>
    </set>

</set>
其中
android:ordering="sequentially" 
控制串行,就是他的一级子项里的内容顺序执行;
android:ordering="together" 
控制并行,就是他的一级子项的内容同事执行。

写完xml文件,我们就可以在代码中调用了:
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();

动画部分,先记到这里,以后遇到再往里面添加新内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值