Android自定义view和动画

Android动画分析(view动画)

2017-01-16  本文已影响23人  ReturnYHH

Android的动画可以分为3种:view动画,帧动画,属性动画,其实帧动画也属于view动画的一种,只不过它和平移,旋转等常见的view动画在表现形式上略有不同而已

view动画:

就是对场景的对象做不同的变换(平移,缩放,旋转,透明度)从而产生动画效果,是一种渐进式动画

帧动画:

类似播放电影,一帧一帧的播放,它通过顺序播放一系列图像从而产生动画效果,但是如果图片较大,会导致OOM

属性动画:

通过动态的改变对象的属性从而达到动画效果,属性动画是API11的新特性,在低版本中无法使用,但是我们可以通过兼容库来兼容它

下面来看看各种动画的特性


view动画

view动画的对象是view,它支持4种动画效果,平移,缩放,旋转,透明度,这4种动画效果对应着Animation的子类:TranslateAnimation(平移),ScaleAnimation(缩放),RotateAnimation(透明度),AlphaAnimation(透明度),这4种属性都可以用xml来定义,我们来看看一张图表:


可以看到不同的动画对应的xml标签是不同的,我们要在xml中使用动画属性,首先需要创建一个xml文件,这个文件的路径是:res/anim/xxx.xml,然后我们就可以在里面写我们自己需要的动画效果,动画效果可以分为2种,一种是单个动画效果,一种是组合动画效果,下面我们看看怎么实现这两种效果,首先我们在res下新建个文件夹叫anim,然后再里面新建两个xml,分别是单个动画效果和组合动画效果

单个动画效果:

translate.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">

    <!--
    duration:表示动画持续时间,单位毫秒
    fromXDelta:表示动画开始时的x坐标
    fromYDelta:表示动画开始时的y坐标
    toXDelta:表示动画结束时的x坐标
    toYDelta:表示动画结束时的y坐标

    注意: 没有指定fromXType toXType fromYType toYType 时候, 默认是以自己为相对参照物   
    -->
    <translate
        android:duration="2000"
        android:fromXDelta="30"
        android:fromYDelta="30"
        android:toXDelta="-80"
        android:toYDelta="300" />
</set>

alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--
   duration:表示动画持续时间,单位毫秒
   fromAlpha:表示动画开始时的透明度
   toAlpha:表示动画结束时的透明度
   -->
    <alpha
        android:duration="1000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
</set>

scale.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <!--
      duration:表示动画持续时间,单位毫秒
      interpolator:插值器,影响动画播放的速度,如加速,减速,加速-减速,
                    决定这个动画效果是以怎样的速度播放,加速播放,减速播放,还是先加速再减速播放
                    默认是@android:anim/accelerate_decelerate_interpolator,即加速-减速
                    加速:accelerate_interpolator
                    减速:decelerate_interpolator
      fillAfter:表示动画结束后是否停留在最后一帧,true表示停留,false表示不停留
      fromXScale:表示动画初始时的缩放的x坐标
      fromYScale:表示动画初始时的缩放的y坐标
      pivotX:表示缩放的x坐标百分比(x坐标缩放多大)
      pivotY:表示缩放的y坐标百分比(y坐标缩放多大)
      toXScale:表示动画结束时缩放的x坐标
      toYScale:表示动画结束时缩放的y坐标
    -->
    <scale
        android:duration="1000"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fillAfter="false"
        android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.4"
        android:toYScale="1.4" />

</set>

rotate.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--
    duration:表示动画持续时间,单位毫秒
    fromDegrees:表示初始时动画旋转的角度
    interpolator:插值器,影响动画播放的速度,如加速,减速,加速-减速,
                    决定这个动画效果是以怎样的速度播放,加速播放,减速播放,还是先加速再减速播放
                    默认是@android:anim/accelerate_decelerate_interpolator,即加速-减速
                    加速:accelerate_interpolator
                    减速:decelerate_interpolator
    pivotX:表示缩放的x坐标百分比(x坐标旋转多大)
    pivotY:表示缩放的y坐标百分比(y坐标旋转多大)
    toDegrees:表示结束时动画旋转的角度
    -->
    <rotate
        android:duration="3000"
        android:fromDegrees="0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="+350" />
</set>

上面这4个就是单个动画效果的写法,现在我们来看看多种动画效果组合

组合动画效果:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="2000"
        android:fromXDelta="30"
        android:fromYDelta="30"
        android:toXDelta="-80"
        android:toYDelta="300" />

    <rotate
        android:duration="3000"
        android:fromDegrees="0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="+350" />
</set>

非常的简单,就是将多个不同的动画组合在set标签里面,现在我们来看看怎么用,非常简单

myView = (MyView) findViewById(R.id.myView);
Animation animation= AnimationUtils.loadAnimation(this,R.anim.translate);
myView.startAnimation(animation);

我们通过AnimationUtils.loadAnimation();来获取到我们动画布局,第一个参数是上下文,第二个就是对应的动画xml文件,然后view.startAnimation开启动画就可以了,另外,我们也可以通过代码来实现动画效果:

 AlphaAnimation animation=new AlphaAnimation(0,1);
 animation.setDuration(300);
 myView.startAnimation(animation);

创建一个透明度的动画效果,设置它在300ms内透明度由0到1,这跟我们通过xml去实现的效果是一样,就不做过多的介绍,另外,我们可以监听动画变化过程:

myView.setLayoutAnimationListener(new Animation.AnimationListener() {
            //动画开启前
            @Override
            public void onAnimationStart(Animation animation) {
                
            }

            //动画结束后
            @Override
            public void onAnimationEnd(Animation animation) {

            }

            //动画进行时
            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

好了,关于view动画的介绍就到这了

上一篇下一篇

猜你喜欢

热点阅读