Android:帧动画与补间动画

目录

帧动画

帧动画是什么?

帧动画使用:

补间动画 补间动画的资源文件,放在 anim文件夹下

补间动画是什么?

补间动画使用的流程:

     补间动画的分类:

使用:

过场动画


帧动画

帧动画是什么?

帧动画非常容易理解,其实就是简单的由N张静态图片收集起来,然后我们通过控制依次显示 这些图片,因为人眼"视觉残留"的原因,会让我们造成动画的"错觉",跟放电影的原理一样!

帧动画使用:

  1. 创建项目

  2. 导入资源, 将图片资源放入 mipmap 文件夹下

  3. 编写资源文件cat_gif.xml 在drawable文件夹下

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@mipmap/img_miao1"
            android:duration="80"/>
        <item android:drawable="@mipmap/img_miao2"
            android:duration="80"/>
        <item android:drawable="@mipmap/img_miao3"
            android:duration="80"/>
        <item android:drawable="@mipmap/img_miao4"
            android:duration="80"/>
        。。。
    ​
    </animation-list>

  4. 在xml页面,添加<Imageview> 并设置其background

    <ImageView
        android:id="@+id/im_cat"
        android:layout_width="340dp"
        android:layout_height="340dp"
        android:background="@drawable/cat_gif"/>

  5. 在java文件中,获取imageview,并对其background进行动画设置

    public class MainActivity extends AppCompatActivity {
    ​
        private ImageView im_cat;
        private AnimationDrawable anim;
    ​
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    ​
            im_cat = findViewById(R.id.im_cat);
    ​
            anim = (AnimationDrawable) im_cat.getBackground();
    ​
        }
    }

开启动画

public class MainActivity extends AppCompatActivity {
​
    private ImageView im_cat;
    private AnimationDrawable anim;
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
​
        im_cat = findViewById(R.id.im_cat);
​
        anim = (AnimationDrawable) im_cat.getBackground();
​
        anim.start();
    }
}

补间动画 补间动画的资源文件,放在 anim文件夹下

补间动画是什么?

帧动画是通过连续播放图片来模拟动画效果,而补间动画开发者只需指定动画开始,以及动画结束"关键帧", 而动画变化的"中间帧"则由系统计算并补齐!

补间动画使用的流程:

     补间动画的分类:

  • AlphaAnimation:透明度渐变效果,创建时许指定开始以及结束透明度,还有动画的持续 时间,透明度的变化范围(0,1),0是完全透明,1是完全不透明;对应<alpha/>标签!

  • <alpha xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromAlpha="1.0"  
        android:toAlpha="0.1"  
    
    
    - fromAlpha :起始透明度
    - **toAlpha**:结束透明度
    - 透明度的范围为:0-1,完全透明-完全不透明

  • ScaleAnimation:缩放渐变效果,创建时需指定开始以及结束的缩放比,以及缩放参考点, 还有动画的持续时间;对应<scale/>标签!

  • <scale xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/accelerate_interpolator"  
        android:fromXScale="0.2"  
        android:toXScale="1.5"  
        android:fromYScale="0.2"  
        android:toYScale="1.5"  
        android:pivotX="50%"  
        android:pivotY="50%"  
        android:duration="2000"/>
    
    
    - **fromXScale**/**fromYScale**:沿着X轴/Y轴缩放的起始比例
    - **toXScale**/**toYScale**:沿着X轴/Y轴缩放的结束比例
    - **pivotX**/**pivotY**:缩放的中轴点X/Y坐标,即距离自身左边缘的位置,比如50%就是以图像的 中心为中轴点

  • TranslateAnimation:位移渐变效果,创建时指定起始以及结束位置,并指定动画的持续 时间即可;对应<translate/>标签!

  • <translate xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromXDelta="0"  
        android:toXDelta="320"  
        android:fromYDelta="0"  
        android:toYDelta="0"  
        android:duration="2000"/>
    
    
    - **fromXDelta**/**fromYDelta**:动画起始位置的X/Y坐标
    - **toXDelta**/**toYDelta**:动画结束位置的X/Y坐标

  • RotateAnimation:旋转渐变效果,创建时指定动画起始以及结束的旋转角度,以及动画 持续时间和旋转的轴心;对应<rotate/>标签

  • <rotate xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
        android:fromDegrees="0"  
        android:toDegrees="360"  
        android:duration="1000"  
        android:repeatCount="1"  
        android:repeatMode="reverse"/> 
    
    fromDegrees/toDegrees:旋转的起始/结束角度
    repeatCount:旋转的次数,默认值为0,代表一次,假如是其他值,比如3,则旋转4次 另外,值为-1或者infinite时,表示动画永不停止
    repeatMode:设置重复模式,默认restart,但只有当repeatCount大于0或者infinite或-1时 才有效。还可以设置成reverse,表示偶数次显示动画时会做方向相反的运动!

  • AnimationSet:组合渐变,就是前面多种渐变的组合,对应<set/>标签

  • <set xmlns:android="http://schemas.android.com/apk/res/android"  
        android:interpolator="@android:anim/decelerate_interpolator"  
        android:shareInterpolator="true" >  
      
        <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>  

使用:

//                Animation animation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.anim_alpha);
//                iv_babi.startAnimation(animation);
//                Animation animation1=AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha_scale);
//                iv_babi.startAnimation(animation1);
//                Animation animation2=AnimationUtils.loadAnimation(MainActivity.this,R.anim.anim_translate);
//                iv_babi.startAnimation(animation2);
//                Animation animation3=AnimationUtils.loadAnimation(MainActivity.this,R.anim.anim_rotate);
//                iv_babi.startAnimation(animation3);
//                Animation animation4=AnimationUtils.loadAnimation(MainActivity.this,R.anim.anim_set);
//                iv_babi.startAnimation(animation4);

过场动画

Intent intent=new Intent(MainActivity.this,MainActivity2.class);
startActivity(intent);
overridePendingTransition(R.anim.anim_translate1,R.anim.anim_translate);

只需要在跳转的时候调用overridePendingTransition方法即可,第一个参数是入场效果,第二个参数是退场效果

猜你喜欢

转载自blog.csdn.net/m0_60623666/article/details/126038198