Frame帧动画以及Animator属性动画的详解

本文介绍了帧动画和属性动画的基本概念及应用方法。帧动画通过连续播放一系列图像实现动画效果,而属性动画则通过改变对象属性实现动态效果。文中详细讲解了如何使用AnimationDrawable管理和控制帧动画,并演示了如何利用ObjectAnimator和ValueAnimator实现属性动画。

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

动画的应用几乎随处可见,可见其重要性:下面是帧动画以及属性动画的一些简单介绍~

Frame动画:也叫帧动画,是通过一张张图片,切换形成的动画,例如电影。。。

    // 初始化帧动画 ( 管理各个帧图像的类 )
    animationDrawable = new AnimationDrawable();
    // 添加帧(添加图像)
    for (int i = 1; i < 11; i++) {
    int resId = getResources().getIdentifier("pic"+i,"drawable",getApplication().getPackageName());
    // 加载图像对象
    Drawable d = getResources().getDrawable(resId);
    animationDrawable.addFrame(d,200);
    }
    animationDrawable.setOneShot(false); // 是否只运行一次
    iv.setImageDrawable(animationDrawable);

Frame动画可以使用AnimationDrawable来管理各个帧图像,然后控制他启动,停止

case R.id.btn_start:
animationDrawable.start();
break;
case R.id.btn_stop:
animationDrawable.stop();
break;

XML 中的配置,可以在 drawable 中创建 xml 文件,根节点为 animation-list ,如: my_frame_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/pic1" android:duration="200"/>
<item android:drawable="@drawable/pic2" android:duration="200"/>
<item android:drawable="@drawable/pic3" android:duration="200"/>
<item android:drawable="@drawable/pic4" android:duration="200"/>
<item android:drawable="@drawable/pic5" android:duration="200"/>
<item android:drawable="@drawable/pic6" android:duration="200"/>
<item android:drawable="@drawable/pic7" android:duration="200"/>
<item android:drawable="@drawable/pic8" android:duration="200"/>
<item android:drawable="@drawable/pic9" android:duration="200"/>
<item android:drawable="@drawable/pic10" android:duration="200"/>
</animation-list>

设置到图片视图上显示动画

<ImageView
android:id="@+id/iv2"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/my_frame_anim"/>
Animator 属性动画

通过不断的改变对象的某些属性(基于数值的变化改变某个属性值),不断的刷新形成的动画,常用的有 ObjectAnimator( 改变对象的属性 set get) 、ValueAnimator( 数值的变化 )

ObjectAnimator

操作的是一个对象的 get/set 方法对应的属性,不断的改变属性值,使其不断的变化产生的动画

class ViewWrapper {
    View v;
    public ViewWrapper(View v) {
        this.v = v;
    }
    public void setWidth(int width) {
        v.getLayoutParams().width = width;
        v.requestLayout();
    }
    public int getWidth() {
        return v.getLayoutParams().width;
    }
}
对 ViewWrapper 使用属性动画
    // 创建视图操作对象 ( 其中提供了 getWidth 和 setWidth 方法来改变或者获取其宽度值 )
    ViewWrapper wrapper = new ViewWrapper(btnAnimator);
    //ofInt 表示针对某个属性值进行整数的变化
    // 改变的对象,改变属性名称,变化的数值
    ObjectAnimator.ofInt(wrapper,"width",200,500)
                .setDuration(2000) // 变化的时间
                .start(); // 开始
常用属性操作
    // 改变透明度
    ObjectAnimator.ofFloat(iv3,View.ALPHA,1.0f,0.5f).setDuration(2000).start();
    // 平移 TRANSLATION_X 水平平移 TRANSLATION_Y 垂直 TRANSLATION_Z 垂直手机屏幕移动
    ObjectAnimator.ofFloat(iv3,View.TRANSLATION_X,0,100).setDuration(2000).start();
    // 旋转 ROTATION_X 表示沿着 X 轴转 ROTATION_Y 沿着 Y 轴转 ROTATION 沿着 Z 轴转
    ObjectAnimator.ofFloat(iv3,View.ROTATION_Y,0,60).setDuration(2000).start();
    // 缩放 SCALE_X 缩放宽度 SCALE_Y 缩放高度
    ObjectAnimator.ofFloat(iv3,View.SCALE_X,1,2.0f).setDuration(2000).start();
ValueAnimator

参考代码如下:

    // 创建一个值变化的对象
    ValueAnimator animator = ValueAnimator.ofFloat(1,100);
    animator.setDuration(2000);
    // 生成的值的特效
    animator.setInterpolator(new BounceInterpolator());
    // 监听变化
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            // 当前值
            float value = (Float)animation.getAnimatedValue();
            float rate = value/100;
            ViewGroup.LayoutParams lp = iv3.getLayoutParams();
            lp.width = (int) ((1+rate)*w);
            lp.height = (int) ((1+rate)*h);
            iv3.setLayoutParams(lp);
            Log.e("m_tag",rate+"%"+" "+lp.width);
            iv3.invalidate();
        }
    });
    // 开始动画
    animator.start();
可以配合计算因子一起去使用计算目标值

参考代码如下:

final IntEvaluator envaluator = new IntEvaluator();
    // 创建一个值变化的对象
    ValueAnimator animator = ValueAnimator.ofFloat(1,100);
    animator.setDuration(2000);
    // 生成的值的特效
    animator.setInterpolator(new BounceInterpolator());
    // 监听变化
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            // 当前值
            float value = (Float)animation.getAnimatedValue();
            float rate = value/100;
            ViewGroup.LayoutParams lp = iv3.getLayoutParams();
            lp.width = envaluator.evaluate(rate,300,500);
            lp.height = envaluator.evaluate(rate,300,500);
            iv3.setLayoutParams(lp);
            Log.e("m_tag",rate+"%"+" "+lp.width);
            iv3.invalidate();
        }
    });
    // 开始动画
    animator.start();
Evaluator

可以基于产生的值的百分比结合起始值和终止值之间计算出最终目标值

IntEvaluator 计算整数
FloatEvaluator 计算小数值
ArgbEvaluator 计算颜色值
TypeEvaluator  可以实现任何类型的计算

public class IntEvaluator implements TypeEvaluator<Integer> {
    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        int startInt = startValue;
        return (int)(startInt + fraction * (endValue - startInt));
    }
}

好了,动画差不多就这些了!
我很喜欢一句话:种一棵树的最佳时机是十年前,其次是现在~
希望可以与各位共同进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值