Android 动画学习(二)

来源:互联网 发布:怎样将淘宝链接发微信 编辑:程序博客网 时间:2024/05/05 20:10


   1、view group中控制子元素的出场效果

      LayoutAnimation作用于view group,这样它de每一个子类就都会以指定的动画效果显现;使用步骤如下:
      1、在res/anim/   的路径下建立一个xml文件,跟view动画一样
       /res/anim/layout_anim

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

   /res/anim/item_anim

    

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <rotate        android:duration="1000"        android:fromDegrees="180"        android:toDegrees="360"        /></set>


   delay表示子元素的动画开始时间的延迟,具体延迟时间计算为:入场动画的时间周期*delay属性所设置的值;例如入场动画时间为100ms,delay值设置为1,则动画开始延迟了100ms。


   animationOrder指的是子元素动画开始的顺序,normal表示的是按子元素顺序执行入场动画,除了normal的还有reverse和random,reverse是逆向显示,random是随机的顺序

    

   animation指定了子元素的入场动画

   设置完之后就可以直接在xml文件中或者代码中直接引用了,android:layoutAnimation="@anim/layout_anim"

   对应的代码实现layoutanimation为一个叫做LayoutAnimationController的类来实现,示例代码如下:

     

       Animation animation = AnimationUtils.loadAnimation(context, R.anim.item_anim);        LayoutAnimationController controller = new LayoutAnimationController(animation);//在构造函数中指定子元素的动画效果        controller.setDelay(1);        controller.setOrder(LayoutAnimationController.ORDER_NORMAL);        viewgroup.setLayoutAnimation(controller);
       
     

    

    2、Activity 的切换效果

          系统有为activity指定了默认的切换效果,和自定义view一样,只要你愿意也可以实现自己的动画切换效果;具体实现也很简单,只要重写activity的overiderPendingTransaition(int enterAnim,  int exiting);方法就可以,enterAnim为activity进入时的动画资源id,exitAnim为activity退出时的动画资源 id;这个方法需要放在startActivity或者finish之后才会起作用。

     3、android动画注意点

         属性动画要求动画作用的对象提供属性的get和set方法,属性动画从外传入的该属性的初始值和最终值,以动画的效果多次调用该属性的set方法更新属性的值,随着时间的变化属性值逐渐发生变化而形成的动画效果,动画效果的显现最直接的就是UI的变化,因此要让属性动画生效需要有两个条件:

         1、Object必须提供属性的set方法用于改变属性的值,在没有传递初始值的情况下还需要提供属性的get方法获取属性的初始值,如果既没有传递初始值又没有提供属性的get方法程序会崩溃
         2、对象属性的设置了新的值之后会有UI上的改变,否则动画看不出效果
         
         所以,如果动画对象没有提供get或者set方法或者set方法在UI上没有效果,则需要从另外的途径解决
         
         1、把属性动画作用的对象封装成一个新的类,在类里面实现get和set方法
          
         2、采用Value Animator 监听update过程,在updatelistener里面实现属性值的更新
         例如:ObjectAnimator.ofInt(button, "width", 500).start();这样设置不会有动画效果,因为button的setWidth方法并不会改变button宽度
方法1来实现
          
private static class ViewWrapper {private View target;public ViewWrapper(View target) {this.target = target;}public void setWidth(int width) {target.getLayoutParams().width = width;}public int getWidth() {return target.getLayoutParams().width;}}ViewWrapper wrapper = new ViewWrapper(button)ObjectAnimator.ofInt(wrapper, "width", 500).start();

方法2实现
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 50);        valueAnimator.setTarget(button);        valueAnimator.setDuration(5000).start();        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator valueAnimator) {                button.getLayoutParams().width = (int)valueAnimator.getAnimatedValue();                button.requestLayout();            }        });

android 动画可能出现的问题

1、OOM:帧动画中如果引用了较多的图片或者图片较大时会出现OOM
2、内存泄漏:属性动画中的一种无限循环的动画需要在activity退出时停止,否则会导致activity无法释放造成内存泄漏
3、view动画的问题:view动画是对view的影像做动画,并不是真正改变view的状态,有时候会出现动画结束后setVisibility(View.gone)失效的问题,这时候调用view.clearAnimation()即可解决此问题
4、使用dp单位,使用px做单位在分辨率不同的设备上会有不同的动画效果
5、动画元素的交互:在将view移动之后,在android3.0之前不管是view动画还是属性动画,view在新位置上都无法接收点击事件,点击移动之前的位置则会触发view的点击事件,在android3.0以后属性动画的点击事件的触发位置为移动后的位置

           
0 0
原创粉丝点击