【Android开发艺术探索】Android动画

Android的动画能够分为三种:View动画、帧动画和属性动画,帧动画也属于View动画的一种,只不过它和平移、旋转等常见的View动画在表现形式上略有不一样而已。app

一、View动画

  • 平移动画:TranslateAnimationide

  • 缩放动画:ScaleAnimation动画

  • 旋转动画:RotateAnimationcode

  • 透明度动画:AlphaAnimationorm

用XML来定义属性动画须要定义在res/anim目录下。对象

二、View动画的特殊使用场景

2.一、LayoutAnimation

LayoutAnimation使用于ViewGroup,为ViewGroup指定一个动画,它的子元素出场时都会具备这种动画效果。这种效果经常使用在ListView上。图片

2.二、Activity的切换效果

主要用到overridePendingTransition(int enterAnim,int exitAnim)这个方法,必须在startActivity(intent)或者finish()以后被调用才能生效。内存

Fragment中添加切换动画,能够经过FragmentTransaction中的setCustomAnimations()方法来添加切换动画,这个切换动画须要的是View动画。get

三、属性动画

属性动画能够对任意对象的属性进行动画而不单单是View,动画默认时间间隔是300ms,默认帧是10ms/帧。animation

用XML来定义属性动画须要定义在res/animator目录下。

对object的属性abc属性作动画,若是要让动画生效,要同时知足两个条件:

一、object必需要提供setAbc方法,若是动画的时候没有传递初始值,还要提供getAbc方法,由于系统要去取abc属性的初始值。若是不知足这条,程序直接Crash。

二、object的setAbc对属性abc所作的改变必须可以经过某种方法反映出来,好比会带来UI的改变等。若是不知足这条,动画无效果但不会Crash。

若是只知足条件1,不知足条件2,能够有3种解决方法:

  • 给对象加上get和set,若是有权限的话

  • 用一个类来包装原始对象,间接为其提供get和set方法

    private void performAnimate(){
    ViewWrapper wrapper = new ViewWrapper(mButton);
    ObjectAnimator.ofInt(wrapper,"width",500).setDuration(5000).start();
    }

    private static class ViewWrapper{
    private View mTarget;

    public ViewWrapper(View target){
          mTarget = target;
      }
    
      public int getWidth(){
          return mTarget.getLayoutParams().width;
      }
    
      public void setWidth(int width){
          mTarget.getLayoutParams().width = width;
          mTarget.requestLayout();
      }

    }

  • 采用ValueAnimator,监听动画过程,本身实现属性的改变

四、注意事项

一、OOM问题

这个问题主要出如今帧动画中,当图片数量较多肯于图片较大时就极易出现OOM。

二、内存泄露

在属性动画中有一类无限循环的动画,这类动画须要在Activity退出时及时中止,不然将致使Activity没法释放从而形成内存泄露,View动画不存在此问题。

三、兼容性问题

动画在3.0如下系统上有兼容性问题。

四、View动画的问题

View动画是对View的影像作动画,并非真正地改变View的状态,所以有时候会出现动画完成后View没法隐藏的现象,即setVisibility(View.GONE)失效,这时只要调用view.clearAnimation()清除View动画便可解决此问题。

五、不要用px

六、动画元素的交互

7硬件加速

使用动画的过程当中,建议开启硬件加速,这样会提升动画的流畅性。

相关文章
相关标签/搜索