欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android动画-视图动画View Animation

程序员文章站 2022-03-01 21:05:27
...

可能筒子们经常会遇到一条面试题“android有几种动画?”对吧(这条面试题真的是烂大街了,能不能别出这道题了),
一般分为三种:
视图动画View Animation
帧动画Drawable Animation
属性动画Property Animation
话不多说,本篇先简单介绍一下视图动画。
(本篇内容为初级介绍,没有该需求的让让 让让哈)

视图动画是个什么鬼东西

视图动画简单来讲,他支持四种变换,分别为平移(TranslateAnimation)、缩放(ScaleAnimation)、旋转(RotateAnimation)、透明(AlphaAnimation)。这4种动画效果是可以单独运行的,也可以是组合运行的,比如你想边移动边缩小,那就利用平移+缩放就可以完成这个动画效果,以此类推。接下来我们分别介绍一下这四种效果。

平移

顾名思义,就是在做一种移动的动画,比如左右移动啊这些只是一个位置的移动。

使用方法

举个用xml实现平移动画的栗子:
首先在res新建一个anim文件夹,接着在里面创建一个xml文件,姑且叫translate_anim.xml吧,在里面写上以下内容

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
           android:fillAfter="true"
           android:duration="3000"
           android:fromXDelta="50%"
           android:fromYDelta="50%"
           android:toXDelta="50%p"
           android:toYDelta="50%p">
</translate>

然后在代码里加载该xml并执行动画

 Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
 iv.startAnimation(animation);

这样就ok了
如果你不开心,想要用代码实现,也行

TranslateAnimation translateAnimation = new TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta);
        translateAnimation.setDuration(4000);
        translateAnimation.setFillAfter(true);
        iv.startAnimation(translateAnimation);

具体的xy轴筒子们自己调整哈,这里只是简单介绍下用法

缩放

缩放还要介绍什么意思吗,来直接看代码,跟上面一样,先来个xml

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
       android:duration="3000"
       android:fromXScale="0.0"
       android:fromYScale="0.0"
       android:pivotX="50%"
       android:pivotY="50%"
       android:toXScale="1.0"
       android:toYScale="1.0">
</scale>

然后在代码里加载该xml并执行动画

 Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
 iv.startAnimation(animation);

代码实现的话

ScaleAnimation scaleAnimation = new ScaleAnimation(float fromX, float toX, float fromY, float toY);
        scaleAnimation.setDuration(3000);
        mImage.startAnimation(scaleAnimation);

ScaleAnimation还有另外两个重载,有需要的可以点进类里查看

旋转

来xm...

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="3000"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="0"
        android:toDegrees="90">
</rotate>

然后在代码里加载该xml并执行动画

 Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
 iv.startAnimation(animation);

代码实现的话

RotateAnimation rotateAnimation = new RotateAnimation(float fromDegrees, float toDegrees);
        rotateAnimation.setDuration(3000);
        mImage.startAnimation(rotateAnimation);
透明度
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="2000">
</alpha>

然后在代码里加载该xml并执行动画

 Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha_anim);
 iv.startAnimation(animation);

代码实现的话

AlphaAnimation alphaAnimation = new AlphaAnimation(float fromAlpha, float toAlpha);
        alphaAnimation.setDuration(3000);
        mImage.startAnimation(alphaAnimation);

以下简单介绍了一下4种动画效果的写法,简单来讲,其实都是差不多的方式,如果xml方式的话,先创建好xml,写好数组,然后用AnimationUtils.loadAnimation(this, R.anim.你的xml),最后调用控件的startAnimation()方法就行了。
当然这几种效果是可以混合的,只要把xml几个写在一起,用set标签包起来就行 比如

<?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!--平移动画标签-->
    <translate
        android:fromXDelta="0%p"
        android:toXDelta="20%p"
        android:fromYDelta="0%p"
        android:toYDelta="20%p"
        android:duration="4000"/>
    <!--缩放动画标签-->
    <scale
        android:fromXScale="1.0"
        android:toXScale="0.2"
        android:fromYScale="1.0"
        android:toYScale="0.2"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="4000"/>
</set>

然后执行他就o了
什么,用代码怎么写?这样写(好懒,拷一份好了)

AnimationSet animationSet1 = new AnimationSet(false);//一级集合
        ScaleAnimation scaleAnimation1 = new ScaleAnimation(1, 1.4f, 1, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
 
        AnimationSet animationSet2 = new AnimationSet(true);//二级集合
        ScaleAnimation scaleAnimation2 = new ScaleAnimation(1.4f, 0, 1.4f, 0, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
        RotateAnimation rotateAnimation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
 
        animationSet2.addAnimation(scaleAnimation2);
        animationSet2.addAnimation(rotateAnimation);
        animationSet2.setInterpolator(new DecelerateInterpolator());
        animationSet2.setDuration(2000);
        animationSet2.setStartOffset(2000);
 
        animationSet1.addAnimation(scaleAnimation1);
        animationSet1.addAnimation(animationSet2);
        animationSet1.setInterpolator(new AccelerateDecelerateInterpolator());
        animationSet1.setDuration(2000);
 
        mImage.startAnimation(animationSet1);

动画监听

我们还可以给动画设置一个监听器,来监听动画的变化,比如

translateAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                //动画开始
            }
 
            @Override
            public void onAnimationEnd(Animation animation) {
               //动画结束
            }
 
            @Override
            public void onAnimationRepeat(Animation animation) {
               //动画重复
            }
        });

layoutAnimation

layoutAnimation也是一个view动画,不过他是针对viewgroup,一般都是用来做为viewgroup一开始加载的时候的动画,比如listview加载的时候的动画,那我们来顺便看看怎样快速搞定
老规矩,先用xml,这次我们先创建一个layout_anim.xml文件

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/layout_item_anim_set"
    android:animationOrder="normal"
    android:delay="0.5">
</layoutAnimation>

接着我们在创建一个layout_item_anim_set.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:duration="300"
     android:interpolator="@android:anim/accelerate_interpolator"
     android:shareInterpolator="true">

    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
    <translate
        android:fromXDelta="500"
        android:toXDelta="0"/>
</set>

最后在listview标签加上

<ListView
    android:layoutAnimation="@anim/layout_anim"
/>

ok,如果用代码的话,layout_item_anim_set.xml先创建(当然你也可以用代码实现一个),然后

Animation animation = AnimationUtils.loadAnimation(this, R.anim.layout_item_anim_set);
    LayoutAnimationController controller = new LayoutAnimationController(animation);
    controller.setDelay(0.5f);
    controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
    listview.setLayoutAnimation(controller);

这样listview一开始加载的时候就会有动画了。

好了,视图动画的介绍就先简单介绍到这里,下一篇我们讲帧动画。