补间动画+属性动画+属性其他动画


布局

<?xml version="1.0" encoding="utf-8"?>

<Button
    android:id="@+id/button_translate"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="补间动画" />

<View
    android:id="@+id/view_translate"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="20dp"
    android:background="#ff0000" />

<Button
    android:id="@+id/button_property"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="属性动画" />

<View
    android:id="@+id/view_property"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="20dp"
    android:background="#00ff00" />

<Button
    android:id="@+id/button_property_other"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:text="属性动画其他" />

<View
    android:id="@+id/view_property_other"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="20dp"
    android:background="#0000ff" />

主页面
/**

  • ValueAnimator 先改变值,然后 手动赋值 给对象的属性从而实现动画;是 间接 对对象属性进行操作;
  • ObjectAnimator 先改变值,然后 自动赋值 给对象的属性从而实现动画;是 直接 对对象属性进行操作;
    */
在这里插入public class AnimationActivity extends AppCompatActivity implements View.OnClickListener {
    private View mViewTranslate, mViewProperty, mViewPropertyOther;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animation);
        init();
    }代码片

private void init() {
    mViewTranslate = findViewById(R.id.view_translate);
    mViewProperty = findViewById(R.id.view_property);
    mViewPropertyOther = findViewById(R.id.view_property_other);

    mViewTranslate.setOnClickListener(this);
    mViewProperty.setOnClickListener(this);
    findViewById(R.id.button_translate).setOnClickListener(this);
    findViewById(R.id.button_property).setOnClickListener(this);
    findViewById(R.id.button_property_other).setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.view_translate:
            Toast.makeText(this, "click view_translate", Toast.LENGTH_SHORT).show();
            break;
        case R.id.view_property:
            Toast.makeText(this, "click view_property", Toast.LENGTH_SHORT).show();
            break;
        case R.id.button_translate:
            //补间动画
            TranslateAnimation translateAnimation = new TranslateAnimation(0, 500,
                    1.0f, 1.0f);
            translateAnimation.setFillAfter(true);
            translateAnimation.setDuration(3000);
            mViewTranslate.startAnimation(translateAnimation);
            break;
        case R.id.button_property:
            //属性动画
            //第一步 ObjectAnimator 实例
            //实例通过ObjectAnimator.ofFloat得来
            //第一个参数,我想要移动的view
            //第二个参数,我想要执行动画的名称
            //第三个参数,起点,每一个节点,按照坐标点依次移动
            final ObjectAnimator translationX = ObjectAnimator.ofFloat(mViewProperty, "translationX", 0, 500, 300, 100, 500);
            //持续时间
            translationX.setDuration(3000);
            //重复次数。。。。。
            translationX.setRepeatCount(0);
            //开始动画
            translationX.start();
            break;
        case R.id.button_property_other:
            //X轴平移
            ObjectAnimator translation_X = ObjectAnimator.ofFloat(mViewPropertyOther, "translationX", 0,500);
            //Y轴平移
            ObjectAnimator translation_Y = ObjectAnimator.ofFloat(mViewPropertyOther, "translationY", 0,50);
            //透明度
            ObjectAnimator alpha = ObjectAnimator.ofFloat(mViewPropertyOther, "alpha", 1f, 0f);
            //X轴缩放
            ObjectAnimator scaleX = ObjectAnimator.ofFloat(mViewPropertyOther, "scaleX", 1f, 2f);
            //Y轴缩放
            ObjectAnimator scaleY = ObjectAnimator.ofFloat(mViewPropertyOther, "scaleY", 1f, 2f);
            //旋转
            ObjectAnimator rotation = ObjectAnimator.ofFloat(mViewPropertyOther, "rotation", 1f, 360f);

            //注意:这里是AnimatorSet
            AnimatorSet animatorSet = new AnimatorSet();
            animatorSet.setDuration(3000);
            //大家一起来
            animatorSet.playTogether(translation_X, translation_Y, alpha, scaleX, scaleY, rotation);

            animatorSet.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {

                }

                @Override
                public void onAnimationEnd(Animator animation) {

                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            });

// //play的动画将在after动画完成后执行
// animatorSet.play(translation_X).after(translation_Y);
// //play的动画将在before动画之前执行
// animatorSet.play(translation_X).before(translation_Y);
// //play的动画将和with动画一起执行
// animatorSet.play(translation_X).with(translation_Y);

            animatorSet.start();



            //通过AnimatorInflater.loadAnimator拿到动画

// Animator anim = AnimatorInflater.loadAnimator(this,R.animator.view_animation);
// //通过setTarget方法将要执行动画的view放置进去
// anim.setTarget(mViewPropertyOther);
// anim.start();
break;
default:
break;
}
}
}

新建一个

<?xml version="1.0" encoding="utf-8"?>

<objectAnimator
    android:duration="1000"
    android:propertyName="translationY"
    android:valueFrom="0"
    android:valueTo="500"
    android:valueType="floatType" />

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

    <set android:ordering="together">
        <objectAnimator
            android:duration="1000"
            android:propertyName="scaleX"
            android:valueFrom="1"
            android:valueTo="5"
            android:valueType="floatType" />
        <objectAnimator
            android:duration="1000"
            android:propertyName="scaleY"
            android:valueFrom="1"
            android:valueTo="5"
            android:valueType="floatType" />
    </set>
</set>
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
补间动画(Tween Animation)和属性动画(Property Animation)是 Android 中常用的两种动画方式,它们在实现方式和效果上有一些区别。 1. 实现方式: - 补间动画补间动画是通过对目标对象的某些属性进行线性插值计算,然后逐步改变这些属性的值来实现动画效果。常见的补间动画包括平移、缩放、旋转和透明度变化等。 - 属性动画属性动画是通过改变对象的属性值来实现动画效果。它可以直接对任意对象的属性进行动画操作,不限于预定义的属性,可以实现更灵活的动画效果。 2. 支持的属性: - 补间动画补间动画只能对指定的属性进行动画操作,且只能是一些预定义的属性,如平移动画只能对 View 的位置属性进行操作。 - 属性动画属性动画可以对任意对象的任意属性进行动画操作,只要该属性有相应的 setter 方法。 3. 效率: - 补间动画补间动画在执行过程中会产生大量的中间帧,需要频繁地重新计算和渲染,可能会造成性能上的开销。 - 属性动画属性动画使用了插值器和估值器来计算动画过程中每一帧的属性值,能够更精确地控制动画效果,性能较好。 综上所述,属性动画在实现方式和灵活性上优于补间动画,且能够更好地控制动画效果。虽然属性动画可能稍微消耗更多的性能,但在大多数情况下,两者的差异不会对性能产生显著影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值