您的位置:首页 > 移动开发 > Android开发

Android 动画学习(二)

2016-04-21 16:13 731 查看



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以后属性动画的点击事件的触发位置为移动后的位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: