1.LayoutAnimationController
LayoutAnimationController可以看做是进场动画,作用的范围是某个ViewGroup的所有子View。
1.layout_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="600">
<alpha
android:fromAlpha="0"
android:toAlpha="1"/>
<translate
android:fromXDelta="50%p"
android:toXDelta="0"/>
<scale
android:fromXScale="0.3"
android:fromYScale="0.3"
android:toXScale="1"
android:toYScale="1"/>
</set>
2.MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_animation);
LinearLayout linearLayout=findViewById(R.id.linear);
Animation animation= AnimationUtils.loadAnimation(this,R.anim.layout_anim);//加载动画
LayoutAnimationController controller=new LayoutAnimationController(animation);//实例化
linearLayout.setLayoutAnimation(controller);//设置
}
3.运行实例
LayoutAnimationController还有一些其他的属性:
(1)setOrder:
LayoutAnimationController.NORMAL 顺序
LayoutAnimationController.RANDOM 随机
LayoutAnimationController.REVERSE 倒叙
controller.setOrder(LayoutAnimationController.ORDER_REVERSE);
(2)setDelay:
设置LayoutAnimation的ViewGroup每个子View出现的时间间隔。
controller.setDelay(2f);
2.LayoutTransition
LayoutTransition为ViewGroup添加删除View时提供动画,只需要在对于的ViewGroup中添加
android:animateLayoutChanges="true"
就会有系统默认的动画效果。
当然,我们也可以通过LayoutTransition自定义动画效果。
创建LayoutTransition:
LayoutTransition transition=new LayoutTransition();
添加动画效果:
transition.setAnimator(int transitionType,Animator animator);
transitionType:
1.LayoutTransition.APPEARING:某个View出现或添加的动画。
2.LayoutTransition.CHANGE_APPEARING:当View添加或出现导致其他View布局改变时的动画,该动画作用去其他被影响的View,不作用于出现的View。
3.LayoutTransition.DISAPPEARING:View消失或者隐藏的动画。
4.LayoutTransition.CHANGE_DISAPPEARING:类似2,是View消失的动画
5.LayoutTransition.CHANGE:布局改变导致某个视图随之改变,例如调整大小,但不包括添加或者移除视图。
常用的只有前四个,最后一个我也不会用。。。
因为3,4两个CHANGE与前面的两个有点不同,所以放在后面举例
LayoutTransition.APPEARING:
LayoutTransition transition=new LayoutTransition();
Animator translation=ObjectAnimator.ofFloat(null,"translationX", 200,0);
transition.setAnimator(LayoutTransition.APPEARING,translation);
linearLayout.setLayoutTransition(transition);
LayoutTransition.DISAPPEARING
PropertyValuesHolder scaleX=PropertyValuesHolder.ofFloat("scaleX", 1f,0f);
PropertyValuesHolder scaleY=PropertyValuesHolder.ofFloat("scaleY",1f,0f);
ObjectAnimator animator= ObjectAnimator.ofPropertyValuesHolder(this,scaleX,scaleY);
transition.setAnimator(LayoutTransition.DISAPPEARING,animator);
这里我们通过PropertyValuesHolder可以实现将多个ObjectAnimator组合到一起的效果。
注意:如果你照着我的代码写,前两行会报错,但又不影响运行,具体原因我也还没找到。
当我们还是按照上面的操作设置那两个CHANGE时,你就会发现问题。
代码如下:
ObjectAnimator animator1=ObjectAnimator.ofFloat(null,"translationX", 0,200);
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,animator1);
结果:
不但其他View的动画效果没有,原本View的消失效果也没了。
但如果我们将其改成下面的,就可以了。
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 pvhScaleOut =
PropertyValuesHolder.ofFloat("scaleX", 1f,2f,1f);
ObjectAnimator changeOut = ObjectAnimator.ofPropertyValuesHolder(
this, pvhLeft, pvhTop, pvhRight, pvhBottom,pvhScaleOut);
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,changeOut);
效果:
这四个是让被影响的其余View移动的关键,但是第二个参数values不一定要设置为0,1 将其设置为0或者1也行,具体原因我也不清楚。但网上都是这么写的,大家也就姑且这么写吧
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);
LayoutTransition.CHANGE_APPEARING与LayoutTransition.CHANGE_DISAPPEARING类似,所以这里就不再举例子了。