Android 动画相关

本文介绍了Android中的三种动画类型:帧动画,通过AnimationDrawable实现图片序列播放;补间动画,包括Alpha、Rotate、Scale和Translate,利用XML定义动画效果;以及属性动画,使用ValueAnimator和ObjectAnimator实现更灵活的动画控制。

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

前言:

Android 动画有三种,帧动画,Tween(补间动画),以及属性动画

一 帧动画

Frame 逐帧动画,把动画的每一张图片收集起来进行显示。

在代码中AnimationDrawable 的方法开始和停止动画。

frame.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/demo1" android:duration="200"/>
    <item android:drawable="@drawable/demo2" android:duration="200"/>

</animation-list>

main.xml

    <ImageView
        android:id="@+id/img_v"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:background="@drawable/frame"/>

main 函数中


        ImageView imgv = findViewById(R.id.img_v);
        // 获取background
        AnimationDrawable background =(AnimationDrawable) imgv.getBackground();
        imgv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (flag){
                    background.start();
                }else{
                    background.stop();
                }
                flag = !flag;
            }
        });

二 Tween

我们只需要给一个begin 和一个end, 只需要这两帧,系统会把中间的动画补全,这就是补间动画。

1 Alpha 动画

透明度动画

alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <alpha
        android:fromAlpha = "0"
        android:toAlpha = "1"
        android:duration = "3000"
        />
</set>

        ImageView imgv = findViewById(R.id.img_v);
        // 获取backgroundAnimationDrawable background =(AnimationDrawable) imgv.getBackground();

        imgv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 通过加载XML 动画设置文件创建一个动画
                Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
                // 开启动画
                imgv.startAnimation(animation);

            }
        });

2 rotate 旋转动画

rotate 记得设置中心点

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--    设置中心轴 :pivotX="50% 图片正中心-->
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:duration="2000"
        />
</set>
​

    Animation animation2 = AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate);
                imgv.startAnimation(animation2);

[点击并拖拽以移动]
​

3 Scale 缩放动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale
        android:fromXScale="0.5"
        android:toXScale="1"
        android:fromYScale="0.5"
        android:toYScale="1"
        android:pivotX="50%"
        android:duration="2000"
        />
</set>
                Animation animation3 = AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale);
                imgv.startAnimation(animation3);

4 translate 平移动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0"
        android:toXDelta="100"
        android:fromYDelta="0"
        android:toYDelta="200"
        android:duration="2000"
        />
</set>

   Animation animation4 = AnimationUtils.loadAnimation(MainActivity.this,R.anim.translate);
                imgv.startAnimation(animation4);

三 属性动画

1 valueAnimator 使用

  // 创建
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 2f);
        // 3秒时间完成
        valueAnimator.setDuration(3000);
        // 监听
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(@NonNull ValueAnimator animator) {
                float value = (float) animator.getAnimatedValue();
                Log.e(TAG, "onAnimationUpdate: " + value);
            }
        });
        // 开启
        valueAnimator.start();

2 ObjectAnimator 的使用

这个直接可以对一个组件使用动画

     // 透明度动画
                ObjectAnimator animator1 = ObjectAnimator.ofFloat(imgv, "alpha", 0f, 1f);
                // 旋转动画
                ObjectAnimator animator2 = ObjectAnimator.ofFloat(imgv, "rotation", 0, 180);
                // 平移动画
                ObjectAnimator animator3 = ObjectAnimator.ofFloat(imgv, "translationX", 0, 100);
                animator3.setDuration(4000);
                animator3.start();

                // 适配的方式监听动画回调完成
                animator2.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                    }
                });

                // 监听器,也可以采用适配的方式选择自己需要重写的方法
                animator3.addListener(new Animator.AnimatorListener() {
                    // 开始的时候调用此方法
                    @Override
                    public void onAnimationStart(@NonNull Animator animator) {

                    }
                    // 动画结束的时候调用此方法
                    @Override
                    public void onAnimationEnd(@NonNull Animator animator) {

                    }
                    // 取消动画的时候调用此方法
                    @Override
                    public void onAnimationCancel(@NonNull Animator animator) {

                    }
                    // 重复执行的时候调用此方法
                    @Override
                    public void onAnimationRepeat(@NonNull Animator animator) {

                    }
                });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值