Android LayoutAnimation 与 LayoutTransition
一、 LayoutAnimation
LayoutAnimation 是API Level 1 就已经有的,LayoutAnimation是对于ViewGroup控件所有的child view的操作,也就是说它是用来控制ViewGroup中所有的child view 显示的动画。LayoutAnimation动画可以直接在xml中定义:
- <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
- android:delay="30%"
- android:animationOrder="reverse"
- android:animation="@anim/slide_right"/>
- 1. android:delay表示动画播放的延时,既可以是百分比,也可以是float小数。
- 2. android:animationOrder表示动画的播放顺序,有三个取值normal(顺序)、reverse(反序)、random(随机)。
- 3. android:animation指向了子控件所要播放的动画。
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="30%"
android:animationOrder="reverse"
android:animation="@anim/slide_right"/>
1. android:delay表示动画播放的延时,既可以是百分比,也可以是float小数。
2. android:animationOrder表示动画的播放顺序,有三个取值normal(顺序)、reverse(反序)、random(随机)。
3. android:animation指向了子控件所要播放的动画。
可以通过下面两种方式加载
1. 直接在ViewGroup的 layout xml 文件中设置:
- android:layoutAnimation="@anim/customer_anim"
android:layoutAnimation="@anim/customer_anim"
- Animation animation=AnimationUtils.loadAnimation(this, R.anim.slide_right); //得到一个LayoutAnimationController对象;
- LayoutAnimationController controller = new LayoutAnimationController(animation); //设置控件显示的顺序;
- controller.setOrder(LayoutAnimationController.ORDER_REVERSE); //设置控件显示间隔时间;
- controller.setDelay(0.3); //为ListView设置LayoutAnimationController属性;
- listView.setLayoutAnimation(controller);
- listView.startLayoutAnimation();
Animation animation=AnimationUtils.loadAnimation(this, R.anim.slide_right); //得到一个LayoutAnimationController对象;
LayoutAnimationController controller = new LayoutAnimationController(animation); //设置控件显示的顺序;
controller.setOrder(LayoutAnimationController.ORDER_REVERSE); //设置控件显示间隔时间;
controller.setDelay(0.3); //为ListView设置LayoutAnimationController属性;
listView.setLayoutAnimation(controller);
listView.startLayoutAnimation();
二、LayoutTransition
LayoutTransition 是API Level 11 才出现的。LayoutTransition的动画效果,只有当ViewGroup中有View添加、删除、隐藏、显示的时候才会体现出来。
1. LayoutTransition类中主要有五种容器转换动画类型,具体如下:
- 1.LayoutTransition.APPEARING:当View出现或者添加的时候View出现的动画。
- 2.LayoutTransition.CHANGE_APPEARING:当添加View导致布局容器改变的时候整个布局容器的动画。
- 3.LayoutTransition.DISAPPEARING:当View消失或者隐藏的时候View消失的动画。
- 4.LayoutTransition.CHANGE_DISAPPEARING:当删除或者隐藏View导致布局容器改变的时候整个布局容器的动画。
- 5.LayoutTransition.CHANGE:当不是由于View出现或消失造成对其他View位置造成改变的时候整个布局容器的动画。
1.LayoutTransition.APPEARING:当View出现或者添加的时候View出现的动画。
2.LayoutTransition.CHANGE_APPEARING:当添加View导致布局容器改变的时候整个布局容器的动画。
3.LayoutTransition.DISAPPEARING:当View消失或者隐藏的时候View消失的动画。
4.LayoutTransition.CHANGE_DISAPPEARING:当删除或者隐藏View导致布局容器改变的时候整个布局容器的动画。
5.LayoutTransition.CHANGE:当不是由于View出现或消失造成对其他View位置造成改变的时候整个布局容器的动画。
2. 在xml中使用系统提供的默认的LayoutTransition动画:
- android:animateLayoutChanges="true"
android:animateLayoutChanges="true"
在ViewGroup添加如上xml属性默认是没有任何动画效果的,因为前面说了,该动画针对于ViewGroup内部东东发生改变时才有效,所以当我们设置如上属性然后调用 ViewGroup的addView、removeView方法时就能看见系统默认的动画效果了。
3. 在代码中使用系统默认的LayoutTransition动画:
- LayoutTransition mTransitioner = new LayoutTransition();
- mViewGroup.setLayoutTransition(mTransitioner);
LayoutTransition mTransitioner = new LayoutTransition();
mViewGroup.setLayoutTransition(mTransitioner);
4. 在代码中自定义LayoutTransition动画:
- // 生成自定义动画
- private void setupCustomAnimations() {
- // 动画:CHANGE_APPEARING
- // Changing while Adding
- PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 1);
- PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 1);
- PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0,
- 1);
- PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom",
- 0, 1);
- PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofFloat("scaleX",
- 1f, 0f, 1f);
- PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofFloat("scaleY",
- 1f, 0f, 1f);
- final ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder(
- this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScaleX,
- pvhScaleY).setDuration(
- mTransitioner.getDuration(LayoutTransition.CHANGE_APPEARING));
- mTransitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn);
- changeIn.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator anim) {
- View view = (View) ((ObjectAnimator) anim).getTarget();
- view.setScaleX(1f);
- view.setScaleY(1f);
- }
- });
- // 动画:CHANGE_DISAPPEARING
- // Changing while Removing
- Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
- Keyframe kf1 = Keyframe.ofFloat(.9999f, 360f);
- Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
- PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(
- "rotation", kf0, kf1, kf2);
- final ObjectAnimator changeOut = ObjectAnimator
- .ofPropertyValuesHolder(this, pvhLeft, pvhTop, pvhRight,
- pvhBottom, pvhRotation)
- .setDuration(
- mTransitioner
- .getDuration(LayoutTransition.CHANGE_DISAPPEARING));
- mTransitioner.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,
- changeOut);
- changeOut.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator anim) {
- View view = (View) ((ObjectAnimator) anim).getTarget();
- view.setRotation(0f);
- }
- });
- // 动画:APPEARING
- // Adding
- ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 90f,
- 0f).setDuration(
- mTransitioner.getDuration(LayoutTransition.APPEARING));
- mTransitioner.setAnimator(LayoutTransition.APPEARING, animIn);
- animIn.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator anim) {
- View view = (View) ((ObjectAnimator) anim).getTarget();
- view.setRotationY(0f);
- }
- });
- // 动画:DISAPPEARING
- // Removing
- ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotationX", 0f,
- 90f).setDuration(
- mTransitioner.getDuration(LayoutTransition.DISAPPEARING));
- mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, animOut);
- animOut.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator anim) {
- View view = (View) ((ObjectAnimator) anim).getTarget();
- view.setRotationX(0f);
- }
- });
- }
一、 LayoutAnimation
LayoutAnimation 是API Level 1 就已经有的,LayoutAnimation是对于ViewGroup控件所有的child view的操作,也就是说它是用来控制ViewGroup中所有的child view 显示的动画。LayoutAnimation动画可以直接在xml中定义:
- <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
- android:delay="30%"
- android:animationOrder="reverse"
- android:animation="@anim/slide_right"/>
- 1. android:delay表示动画播放的延时,既可以是百分比,也可以是float小数。
- 2. android:animationOrder表示动画的播放顺序,有三个取值normal(顺序)、reverse(反序)、random(随机)。
- 3. android:animation指向了子控件所要播放的动画。
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="30%"
android:animationOrder="reverse"
android:animation="@anim/slide_right"/>
1. android:delay表示动画播放的延时,既可以是百分比,也可以是float小数。
2. android:animationOrder表示动画的播放顺序,有三个取值normal(顺序)、reverse(反序)、random(随机)。
3. android:animation指向了子控件所要播放的动画。
可以通过下面两种方式加载
1. 直接在ViewGroup的 layout xml 文件中设置:
- android:layoutAnimation="@anim/customer_anim"
android:layoutAnimation="@anim/customer_anim"
- Animation animation=AnimationUtils.loadAnimation(this, R.anim.slide_right); //得到一个LayoutAnimationController对象;
- LayoutAnimationController controller = new LayoutAnimationController(animation); //设置控件显示的顺序;
- controller.setOrder(LayoutAnimationController.ORDER_REVERSE); //设置控件显示间隔时间;
- controller.setDelay(0.3); //为ListView设置LayoutAnimationController属性;
- listView.setLayoutAnimation(controller);
- listView.startLayoutAnimation();
Animation animation=AnimationUtils.loadAnimation(this, R.anim.slide_right); //得到一个LayoutAnimationController对象;
LayoutAnimationController controller = new LayoutAnimationController(animation); //设置控件显示的顺序;
controller.setOrder(LayoutAnimationController.ORDER_REVERSE); //设置控件显示间隔时间;
controller.setDelay(0.3); //为ListView设置LayoutAnimationController属性;
listView.setLayoutAnimation(controller);
listView.startLayoutAnimation();
二、LayoutTransition
LayoutTransition 是API Level 11 才出现的。LayoutTransition的动画效果,只有当ViewGroup中有View添加、删除、隐藏、显示的时候才会体现出来。
1. LayoutTransition类中主要有五种容器转换动画类型,具体如下:
- 1.LayoutTransition.APPEARING:当View出现或者添加的时候View出现的动画。
- 2.LayoutTransition.CHANGE_APPEARING:当添加View导致布局容器改变的时候整个布局容器的动画。
- 3.LayoutTransition.DISAPPEARING:当View消失或者隐藏的时候View消失的动画。
- 4.LayoutTransition.CHANGE_DISAPPEARING:当删除或者隐藏View导致布局容器改变的时候整个布局容器的动画。
- 5.LayoutTransition.CHANGE:当不是由于View出现或消失造成对其他View位置造成改变的时候整个布局容器的动画。
1.LayoutTransition.APPEARING:当View出现或者添加的时候View出现的动画。
2.LayoutTransition.CHANGE_APPEARING:当添加View导致布局容器改变的时候整个布局容器的动画。
3.LayoutTransition.DISAPPEARING:当View消失或者隐藏的时候View消失的动画。
4.LayoutTransition.CHANGE_DISAPPEARING:当删除或者隐藏View导致布局容器改变的时候整个布局容器的动画。
5.LayoutTransition.CHANGE:当不是由于View出现或消失造成对其他View位置造成改变的时候整个布局容器的动画。
2. 在xml中使用系统提供的默认的LayoutTransition动画:
- android:animateLayoutChanges="true"
android:animateLayoutChanges="true"
在ViewGroup添加如上xml属性默认是没有任何动画效果的,因为前面说了,该动画针对于ViewGroup内部东东发生改变时才有效,所以当我们设置如上属性然后调用 ViewGroup的addView、removeView方法时就能看见系统默认的动画效果了。
3. 在代码中使用系统默认的LayoutTransition动画:
- LayoutTransition mTransitioner = new LayoutTransition();
- mViewGroup.setLayoutTransition(mTransitioner);
LayoutTransition mTransitioner = new LayoutTransition();
mViewGroup.setLayoutTransition(mTransitioner);
4. 在代码中自定义LayoutTransition动画:
- // 生成自定义动画
- private void setupCustomAnimations() {
- // 动画:CHANGE_APPEARING
- // Changing while Adding
- PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 1);
- PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 1);
- PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0,
- 1);
- PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom",
- 0, 1);
- PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofFloat("scaleX",
- 1f, 0f, 1f);
- PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofFloat("scaleY",
- 1f, 0f, 1f);
- final ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder(
- this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScaleX,
- pvhScaleY).setDuration(
- mTransitioner.getDuration(LayoutTransition.CHANGE_APPEARING));
- mTransitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn);
- changeIn.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator anim) {
- View view = (View) ((ObjectAnimator) anim).getTarget();
- view.setScaleX(1f);
- view.setScaleY(1f);
- }
- });
- // 动画:CHANGE_DISAPPEARING
- // Changing while Removing
- Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
- Keyframe kf1 = Keyframe.ofFloat(.9999f, 360f);
- Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
- PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(
- "rotation", kf0, kf1, kf2);
- final ObjectAnimator changeOut = ObjectAnimator
- .ofPropertyValuesHolder(this, pvhLeft, pvhTop, pvhRight,
- pvhBottom, pvhRotation)
- .setDuration(
- mTransitioner
- .getDuration(LayoutTransition.CHANGE_DISAPPEARING));
- mTransitioner.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,
- changeOut);
- changeOut.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator anim) {
- View view = (View) ((ObjectAnimator) anim).getTarget();
- view.setRotation(0f);
- }
- });
- // 动画:APPEARING
- // Adding
- ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 90f,
- 0f).setDuration(
- mTransitioner.getDuration(LayoutTransition.APPEARING));
- mTransitioner.setAnimator(LayoutTransition.APPEARING, animIn);
- animIn.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator anim) {
- View view = (View) ((ObjectAnimator) anim).getTarget();
- view.setRotationY(0f);
- }
- });
- // 动画:DISAPPEARING
- // Removing
- ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotationX", 0f,
- 90f).setDuration(
- mTransitioner.getDuration(LayoutTransition.DISAPPEARING));
- mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, animOut);
- animOut.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator anim) {
- View view = (View) ((ObjectAnimator) anim).getTarget();
- view.setRotationX(0f);
- }
- });
- }
上一篇: 纯js 判断手势滑动方向
推荐阅读
-
Android LayoutAnimation 与 LayoutTransition
-
Android动画分析详解(一) View动画、帧动画、LayoutAnimation、Activity切换动画
-
动画系列——LayoutAnimation与GridLayoutAnimation
-
Android LayoutAnimation不生效
-
Android点击事件之多点触摸与手势识别
-
Android 之 Binder与进程间通信
-
Android Binder通信二 Binder驱动与协议
-
Android客户端与服务器的数据交互总结
-
android客户端与javaweb服务器端数据通信-异步Get
-
android客户端与javaweb服务器端数据通信-Post-键值对