Android动画学习记录。

 在Android中有四种动画:ScaleAnimation(伸缩动画)、AlphaAnimation(透明动画)、RotateAnimation(旋转动画)、TranslateAnimation(平移动画)。

下面分别简单实现这四种动画。

前期准备

在写伸缩动画之前,我首先建立了一个普通的Android项目。

public class MainActivity extends AppCompatActivity {

    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        //加载布局
        setContentView(R.layout.animal_test_activity);
        //初始化img
        img = findViewById(R.id.img);
    }
}

我的animal_test_activity布局是这样的

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Scale"
        android:textSize="20sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Alpha"
        android:textSize="20sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Rotate"
        android:textSize="20sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Translate"
        android:textSize="20sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Set"
        android:textSize="20sp" />

    <ImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:src="@drawable/testImg">

    </ImageView>
</LinearLayout>

5个按钮,出了上面的四个动画之外,还有一个set,即集合动画,多种动画的组合。后面我将会为这些按钮添加对应事件。

ScaleAnimation(伸缩动画)

public void scaleTest(View view) {

        ScaleAnimation animation = new ScaleAnimation(0,1,0,1,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        //设置展示时间
        animation.setDuration(2000);
        //设置重复次数,默认为0。 值得注意的是,这里0代表执行一次,1代表执行两次,以此类推。-1代表一直重复
        animation.setRepeatCount(0);
        //设置动画执行的等待时间,每次动画的执行都会有这个等待时间
        animation.setStartOffset(1000);

        //给img控件设置动画并开始动画
        img.startAnimation(animation);
    }

几种scaleAnimation的构造函数

android testview 缩放动画 android 伸缩动画_Android

我这里用的是第三个构造函数,参数含义如下

/*
            这里坐标的起始位置都是装载图片的左上角
            fromX:开始X位置
            toX:结束X位置
            fromY:开始Y位置
            toY:结束Y位置
            上面四个的位置都是相对于图片自身而言
            pivotXType:伸缩的中心轴的X坐标的位置类型,RELATIVE_TO_SELF表示相对自身的位置,
            若为1则跟自身的X大小一样。RELATIVE_TO_PARENT表示相对于父容器的大小,ABSOLUTE表示绝对            
            大小,即像素点大小
            pivotXValue:伸缩的中心轴的X坐标
            pivotYType:伸缩的中心轴的Y坐标的表达类型
            pivotYValue:伸缩的中心轴的Y坐标
         */

这里构造函数的参数可能会觉得有点迷茫,我用第三个构造函数,里面的参数是(0,1,0,1,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f)f代表浮点数

这里的意思是:图片观测大小从x,y = 0(因为0相对于任何参照都是0)到跟图片本身大小一样的伸缩过程。伸缩中心点是Animation.RELATIVE_TO_SELF相对于图片本身大小的一半(0.5f),即图片的中心点是伸缩中心点。

除了以上属性外,常用的属性还有fillAfter,和fillBefore。通过这两个方法setFillAfter()、setFillBefore()可以对动画的fillAfter、fillBefore进行设置。这两个方法的参数都是bool类型,如果设置fillAfter为True,则代表动画播放完后停止在最后的界面;如果设置fillBefore为True,则代表动画播放完后停止在开始的界面。

同时还有一个比较常用的属性Interpolator。通过setInterpolato(Interpolator i)对他进行设置。

android testview 缩放动画 android 伸缩动画_animation_02

当然有很多的Interpolator。如AccelerateInterpolator(使动画加速播放)、DecelerateInterpolator(使动画减速播放)等等

AlphaAnimation(透明动画)

对于以上的属性AlphaAnimation、RotateAnimation、TranslateAnimation都是有的,下面案例就不在演示这些属性了。

public void alphaTest(View view) {

        //参数0,1表示透明程度从完全透明到完全不透明,当然也可以设置为其他浮点数
        AlphaAnimation animation = new AlphaAnimation(0,1);
        //设置展示时间
        animation.setDuration(3000);
        //给img控件设置动画并开始动画
        img.startAnimation(animation);
    }

RotateAnimation(旋转动画)

public void rotateTest(View view) {

        //  参数:开始角度、
        // 结束角度、
        // 长度计量方式,RELATIVE_TO_SELF代表相对于自身,跟scaleAnimation的一样、
        // 计量数x,0.5代表相对自身0.5的位置
        // 长度计量方式,RELATIVE_TO_SELF代表相对于自身,跟前面的一样、
        // 计量数y,0.5代表相对自身0.5的位置
        // x,y 决定了旋转中心,这里即在图片的中心,这些位置都是相对于图片左上角的
        RotateAnimation animation = new RotateAnimation(0,90,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        //设置展示时间
        animation.setDuration(3000);
        //给img控件设置动画并开始动画
        img.startAnimation(animation);
    }

TranslateAnimation(平移动画)

public void translateAnimation(View view) {
        
        /*
        平移动画需要确定平移前左上角的位置和平移后的左上角的位置,分别都有四个参数决定,我这里代表观测图片左上角的位置从默认图片左上角到默认图片的中心
         */
        TranslateAnimation animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.5f);
        animation.setDuration(3000);
        //给img控件设置动画并开始动画
        img.startAnimation(animation);
    }

SetAnimation(集合动画)

public void setTest(View view) {
        
        //参数true、false暂时都可以
        AnimationSet set = new AnimationSet(false);
        TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.5f);
        translateAnimation.setDuration(3000);

        RotateAnimation rotateAnimation = new RotateAnimation(0,90,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        rotateAnimation.setDuration(3000);

        //向set里面添加animation
        set.addAnimation(translateAnimation);
        set.addAnimation(rotateAnimation);
        
        img.startAnimation(set);
    }

当然如果想让集合动画里面的动画有次序的进行,可以通过setStartOffset()设置每个动画的执行延后时间。