Android 帧动画(Frame,补间动画(Tween)的简单使用

本文详细介绍了如何在Android中实现帧动画和补间动画。通过创建ImageView、设置资源文件、自定义类来控制帧动画的播放,并探讨了补间动画的工作原理和应用场景,包括Activity跳转动画、透明度、缩放、位移和旋转等多种动画效果的实现。

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

代码都在下面 

帧:AnimationDrawable 补间:Animation

帧动画

实现原理就是把我们的很多张图片通过快速的播放,让肉眼觉得是一个连贯的动画

1.1创建我们的ImagerView和Button:

1.2把图片放进app.res.mipmap文件下

1.3创建一个资源文件,让我们的ImageView可以引入资源,在app.res.drawable下创建一个donghua,资源文件放在background下面。xml文件用的方法是:

1.4在我们的MainActivity.java文件内AnimationDrawable(动画效果)可以让我们引入的图片动起来:​​​​​​​

另外一种 在点击的地方播放帧动画

 2.1:创建我们的ImagerView和Button:

2.2:把图片放进app.res.mipmap文件下

2.3:创建一个资源文件,让我们的ImageView可以引入资源,在app.res.drawable下创建一个donghua。xml文件用的方法是

2.4:在我们的java.xxx.xxx包下创建一个类,在类里面我们自定一个Image View这里通过反射获取当前播放的帧,判断是否为最后一帧,是的话隐藏控件

2.5创建我们刚刚写的那个类 添加View添加View,对触摸事件中按下的 事件做处理,显示控件以及开启动画

补间动画

只需要用制定动画的开始和结束帧,中间的帧由系统补齐

过场动画 Activity跳转时的动画 需要放在startActrivity(intent)的后面overridePendingTransition(R.anim.xxx,R.anim.xxx);开始和结束

因为是动画所以创建app.res.anim(anim这个文件夹需要我们new-》AndroidResource Directory里面找到并创建

  1. 五种动画的简单使用,(这里我把XML的代码放在对应的功能下,把java代码放在他们五个下面)

  2. 透明度渐变动画

  3. fromAlpha :起始透明度

  4. toAlpha:结束透明度

  5. 透明度的范围为:0-1,完全透明-完全不透明

  6. <?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromAlpha="1.0"
        android:toAlpha="0.0"
        android:duration="3000"
        >
    
    </alpha>

    缩放渐变动画

  7. fromXScale/fromYScale:沿着X轴/Y轴缩放的起始比例

  8. toXScale/toYScale:沿着X轴/Y轴缩放的结束比例

  9. pivotX/pivotY:缩放的中轴点X/Y坐标,即距离自身左边缘的位置,比如50%就是以图像的 中心为中轴点

  10. <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="0.3"
        android:toXScale="1.5"
        android:fromYScale="0.2"
        android:toYScale="1.5"
        android:pivotY="50%"
        android:pivotX="50%"
        android:duration="2000"
        >
    </scale>
  11.   位移渐变动画

  12. fromXDelta/fromYDelta:动画起始位置的X/Y坐标

  13. toXDelta/toYDelta:动画结束位置的X/Y坐标

  14. <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXDelta="0"
        android:toYDelta="690"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:duration="3000"
        >
    </translate>
  15. 旋转渐变动画

  16. fromDegrees/toDegrees:旋转的起始/结束角度

  17. repeatCount:旋转的次数,默认值为0,代表一次,假如是其他值,比如3,则旋转4次 另外,值为-1或者infinite时,表示动画永不停止

  18. repeatMode:设置重复模式,默认restart,但只有当repeatCount大于0或者infinite或-1时 才有效。还可以设置成reverse,表示偶数次显示动画时会做方向相反的运动!

  19. <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromDegrees="0"
        android:toDegrees="180"
        android:duration="3000"
        android:repeatCount="1"
        android:repeatMode="reverse"
        >
    
    </rotate>
  20. 组合渐变动画

  21. <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        >
        <scale
            android:duration="2000"
            android:fromXScale="0.2"
            android:fromYScale="0.2"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="1.5"
            android:toYScale="1.5" />
    
        <rotate
            android:duration="1000"
            android:fromDegrees="0"
            android:repeatCount="1"
            android:repeatMode="reverse"
            android:toDegrees="360" />
    
        <translate
            android:duration="2000"
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="320"
            android:toYDelta="0" />
    
        <alpha
            android:duration="2000"
            android:fromAlpha="1.0"
            android:toAlpha="0.1" />
    </set>
     private Button btn_touMing,btn_xuanZhuan,btn_suoFang,btn_weiYi,btn_zuHe;
        private ImageView iv_bu;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main3);
    
            btn_touMing=findViewById(R.id.btn_touMing);
            btn_xuanZhuan=findViewById(R.id.btn_xuanZhuan);
            btn_suoFang=findViewById(R.id.btn_suoFang);
            btn_weiYi=findViewById(R.id.btn_weiYi);
            btn_zuHe=findViewById(R.id.btn_zuHe);
            iv_bu=findViewById(R.id.iv_bu);
            btn_touMing.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Animation animation= AnimationUtils.loadAnimation(MainActivity3.this,R.anim.alpha_anim);
                    iv_bu.startAnimation(animation);
                }
            });
            btn_suoFang.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Animation animation=AnimationUtils.loadAnimation(MainActivity3.this,R.anim.anim_scale);
                    iv_bu.startAnimation(animation);
                }
            });
            btn_weiYi.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Animation animation=AnimationUtils.loadAnimation(MainActivity3.this,R.anim.anim_translate);
                    iv_bu.startAnimation(animation);
                }
            });
            btn_xuanZhuan.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Animation animation=AnimationUtils.loadAnimation(MainActivity3.this,R.anim.anim_rotate);
                    iv_bu.startAnimation(animation);
                }
            });
            btn_zuHe.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Animation animation=AnimationUtils.loadAnimation(MainActivity3.this,R.anim.anim_set);
                    iv_bu.startAnimation(animation);
                }
            });
    
        }

1.1和 2.1

    <Button
        android:id="@+id/btn_KaiShi"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始"/>

    <Button
        android:id="@+id/btn_JieShu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止"/>

    <ImageView
        android:id="@+id/iv_Zhen"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/donghua"
        />

1.2和2.2导入自己的图片

1.3和2.3

drawable我们的图片地址duration图片停留的毫秒数

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <item
        android:drawable="@mipmap/a1"
        android:duration="500" />

</animation-list>

 1.4

    //获取按钮
    //获取ImagerView
    private ImageView iv_Zhen;
    private Button btn_KaiShi;
    private Button btn_JieShu;
    //可以让动画动起来
    private AnimationDrawable anim;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_JieShu=findViewById(R.id.btn_JieShu);
        btn_KaiShi=findViewById(R.id.btn_KaiShi);
        iv_Zhen=findViewById(R.id.iv_Zhen);
        //获取Background为了让他动起来给AnimationDrawable
        anim=(AnimationDrawable) iv_Zhen.getBackground();
        btn_KaiShi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //因为已经把Background给Animation Drawable所以直接使用.start开启
                anim.start();
            }
        });
        btn_JieShu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //因为已经把Background给Animation Drawable所以直接使用.stop关闭
                anim.stop();
            }
        });


    }

2.4

blic class ImageV extends androidx.appcompat.widget.AppCompatImageView {
    private AnimationDrawable anim;
    public ImageV(@NonNull Context context) {
        super(context);
    }

    public ImageV(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public ImageV(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setAnim(AnimationDrawable anim) {
        this.anim = anim;
    }
    void setLocation(int top, int left){
        this.setFrame(left,top,left+200,top+200);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        try {
            //反射调用AnimationDrawable
            Field field=AnimationDrawable.class.getDeclaredField("mCurFrame");
            field.setAccessible(true);
            //获取anim动画的当前帧
            int curFrame=field.getInt(anim);
            //如果已经到了最后一帧
            if (curFrame == anim.getNumberOfFrames()-1) {
                //该让View隐藏
                setVisibility(View.INVISIBLE);
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        super.onDraw(canvas);
    }

2.5

     private ImageV IV;
    private AnimationDrawable anim=null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //自定义一个帧布局
        FrameLayout flt=new FrameLayout(MainActivity2.this);
        setContentView(flt);
        //向布局当中添加控件
        //创建自定义控件
        IV=new ImageV(MainActivity2.this);
        //给空间设置背景
        IV.setBackgroundResource(R.drawable.donghua);
        //图片不可见
        IV.setVisibility(View.INVISIBLE);
        //将背景转化为动画
        anim=(AnimationDrawable) IV.getBackground();
        //将动画转递给iv,就是为了动画执行完毕之后,将图片隐藏起来
        IV.setAnim(anim);
        //向布局添加控件
        flt.addView(IV);
        //触摸事件
        flt.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //设置按下时才产生动画效果
                if (event.getAction() ==MotionEvent.ACTION_DOWN) {
                    anim.stop();
                    float x=event.getX();
                    float y=event.getY();
                    IV.setLocation((int)y-40,(int)x-20);
                   //View显示的位置,点击哪里哪里可见
                    IV.setVisibility(View.VISIBLE);
                    anim.start();//开启动画
                }
                return false;
            }
        });
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值