Android 动画学习(二)


   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以后属性动画的点击事件的触发位置为移动后的位置

           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值