Skip to content

Android 动画

DawnSpring edited this page Jan 18, 2021 · 3 revisions

种类

帧动画、补间动画、属性动画

帧动画

每帧动画取决于UI资源,eg:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
    <item
        android:drawable="@drawable/s_1"
        android:duration="100" />
    <item
        android:drawable="@drawable/s_2"
        android:duration="100" />
    <item
        android:drawable="@drawable/s_3"
        android:duration="100" />
</animation-list>

使用:

 <ImageView
        android:id="@+id/iv_frame_anim"
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="200dp"
        android:src="@drawable/frame_anim1"/>
//iv_frame_anim.setImageDrawable(resources.getDrawable(R.drawable.frame_anim1)) //setImageDrawable(R.drawable.frame_anim1)
 var animationImag1Drawable = (iv_frame_anim.drawable as AnimationDrawable).also {
            it.start()
 }

补间动画

淡入淡出(alpha)、translate、scale、rotate

xml实现

在res/anim/(只能放在这!)文件夹下定义动画

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromXScale="0.0"
    android:fromYScale="0.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="1.0"
    android:toYScale="1.0"/>
//android:pivotX="50%"和android:pivotY="50%":以进行动画控件的左上角为原点坐标, 
50%表示原点坐标加上自己宽度的 50%(即控件水平中心)作为起始点;
当属性值为数值,如 50 时,表示原点坐标加上 50px,作为起始点;
50%p 就是表示在原点坐标加上父控件宽度的 50% 作为起始点 x 轴坐标
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromAlpha="1.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:toAlpha="0.0"
    />
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromXDelta="0.0"
    android:toXDelta="50%p"
    android:fromYDelta="0.0"
    android:toYDelta="50%p"/>
// 整型值:  
                fromXDelta 属性为动画起始时 X坐标上的位置  
                toXDelta   属性为动画结束时 X坐标上的位置  
                fromYDelta 属性为动画起始时 Y坐标上的位置  
                toYDelta   属性为动画结束时 Y坐标上的位置  
                注意:  
                         没有指定,  
                         默认是以自己为相对参照物  
            长整型值:  
                duration  属性为动画持续时间  
                说明:   时间以毫秒为单位  
在这些属性里面还可以加上%和p,例如:

android:toXDelta="100%",表示自身的100%,也就是从View自己的位置开始。

android:toXDelta="80%p",表示父层View的80%,是以它父层View为参照的。
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromDegrees="0.0"
    android:toDegrees="360.0"
    android:pivotX="50%"
    android:pivotY="50%"
/>

使用动画xml:

   //补间动画
   var animation = AnimationUtils.loadAnimation(activity, R.anim.translate_test)
   //动画执行完毕后是否停在结束时的角度上!!!
   animation.fillAfter = true;
   iv_frame_anim.startAnimation(animation)

备注:参考https://www.jianshu.com/p/420629118c10

Clone this wiki locally