Android动画

在Android中,动画有帧动画、补间动画、属性动画、VectorDrawable,可以做出各种华丽的效果。那它们之间有什么区别呢?我们来慢慢分析。

1.帧动画

帧动画就是常说的Frame动画,Frame动画用一系列微小差异的图片按照顺序快速展示,从而达到了动画的效果,是不是想到了这货和放电影不是一样吗?是的。
Frame动画可以由XML代码写也可以用Java代码写:
xml代码
如果用xml代码写的话,xml文件可以放置在/res下的anim或者drawable中,文件名作为资源id就在代码中引用,标签必须作为根元素,它可以包涵多个元素,每个
元素指向一个图片,android:onshot如果定义为true,这个动画会执行一次,如果为false它就会无限循环,android:drawable指定图片,android:duration指定此帧持续的时间,单位是ms
java代码
用Java的话,需要用到AnimationDrawable对象,播放动画时用start()这个方法。

2.补间动画

补间动画也中tween动画,tween意思是在两者之间,在...中间,tween动画其实是操控某个控件进行旋转、移动、渐变、缩放从而达到动画的效果,同样可以用java代码或xml来写。
xml代码:
xml文件必须放在/res/anim下,xml的根元素可以是中的任意一个,也可以是来管理一个由前面几个元素组成动画集合。
是一个动画容器,管理多个动画群组,与之对应的Java对象是AnimationSet,AnimationSet有两个属性:
android:interpolator 代表一个插值器资源,可以引用系统自带的插值器资源,资源id在@android:anim/下,
是通明度渐变动画,可以实现淡入、淡出效果,对应的是AlphaAnimation对象
android:fromAlpha 代表起始属性值,是一个浮点值从0.0到1.0,分别代表通明和完全不通明。
android:toAlpha 代表结尾alpha值,是一个浮点值从0.0到1.0,分别代表通明和完全不通明。

是缩放动画,可以缩放控件大小,对应的Java对象是ScaleAnimation。
android:fromXScale代表起始的从X方向相对自身的缩放比例,1.0代表无变化,0.5缩小一倍,2.0表示放大一倍。
android:toXScale代表结束的从X方向相对自身的缩放比例,1.0代表无变化,0.5缩小一倍,2.0表示放大一倍。
android:privotX 代表缩放中轴点X坐标,android:privotY 代表缩放中轴点Y坐标,如果我们想把中轴点的中心表示为图像的中心可以设置为0.5

表示移动动画,对应的Java对象是TranslateAnimation,
android:fromXDelta,表示起始X方向的位置,
android:toXDelta表示X方向结束的位置,
单位如果用浮点数表示,代表原始位置像素值,num%表示相对于自己位置的百分比,num&p表示相对于父类组件的百分比。
建议单位用百分比比较好,在不同手机上误差小。

旋转动画,与之对应的Java对象是RoateAnimation,
android:fromDegress代表起始角度,浮点值
android:toDegress代表结束角度,浮点值

android:pivotX
android:pivotY
这两个属性代表旋转中心,也有三种表示方式,数字方式代表像素值、num%和num%p;
tween动画比较简单只能用在View对象之上,局限性较大。

3属性动画

在Android3.0以后Android推出了属性动画。
ValueAnimator是属性动画最核心的一个类,它的作用是在不断的修改对象的值来实现动画的效果。
属性动画每次更新时都会调用onAnimationUpdate方法,用这个方法可以获取属性的最新值。

xml:

然后在Java代码中加载该动画

ValueAnimator animator = AnimatorInflater.loadAnimator(getApplicationContext(),R.anim.value_animation);

动画更新时调用 onAnimationValueUpdate方法

public void onAnimationValueUpdate(ValueAnimator animation)
{
    float newValue = (Float) animation.getAnimatedValue();
    myView.setAlpha(newValue); 
}

ValueAnimator虽然自定义程度高,但是开发效率低下,而ObjectAnimaor会显得更好用。

ObjectAnimator  animator = ObjectAnimator.ofFloat(myView,"alpha",1.0f,0.3f,0.7f);
animation.setDuration(2000);
animation.start();

ObjectAnimator通过ofFloat静态工厂方法来构建ObjectAnimator对象,以上代码是将myView这个控件在2秒内通明度从1.0变为0.3最后变为0.7f。
如果想让多个动画组合起来可以使用PropertyValuesHolder,也可以使用AnimaorSet,AnimationSet调用playTogether就可以让多个ObjectAnimator对象加入进来。

android 3.0以后增加给View增加了一个animate()方法来直接驱动属性动画,其实animate可以说是属性动画的一种简写方式。

              btn.animate()
                        .setDuration(2000)
                        .alpha(0.5f)
                        .scaleX(1.5f)
                        .withStartAction(new Runnable() {
                            @Override
                            public void run() {
                                
                            }
                        })
                        .withEndAction(new Runnable() {
                            @Override
                            public void run() {
                                
                            }
                        })
                        .start();

Android布局动画
最简单可以为ViewGoup设置android:animateLayoutChanges="true"这是系统默认的不能更改。
也可以用LayoutAnimationController类定义一个实现过渡效果的View

   ll = (LinearLayout) findViewById(R.id.ll);
        ScaleAnimation animation = new ScaleAnimation(0,1,0,1);
        animation.setDuration(2000);
        LayoutAnimationController controller = new LayoutAnimationController(animation,0.5f);
        controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
        ll.setLayoutAnimation(controller);
   不过好像并没有什么效果。

   自定义动画
   需要实现applyTransfromation,还需要覆盖initialize()方法。

   android 5.0以上 svg矢量动画。

你可能感兴趣的:(Android动画)