容器布局动画LayoutTransition的介绍
在Android应用开发的时候经常会用到View的setVisibility()方法来动态隐藏和显示view,但是这样子是没有过渡动画的,变化的时候会显得很生硬。
LayoutTransition是一个在4.0新引入的Api。
主要功能是在ViewGroup的layout发生变化的时候能够自动创建动画。具体使用的时候,首先创建一个LayoutTransition对象,并在容器布局调用setLayoutTransition(LayoutTransition)方法。这样,每当有子view从容器中出现或消失的时候,默认的animator就会被自动调用。当然,你也可以通过setAnimator()来设置自定义的动画。
ViewGroup container = (ViewGroup) findViewById(R.id.container);
LayoutTransition transition = new LayoutTransition();
container.setLayoutTransition(transition);
如果你要使用默认的动画,一个非常简单的方式是在ViewGroup的XML布局文件中把android:animateLayoutchanges 属性设置为true。
在4.1 JellyBean上还有一个增强的功能,可以在容器内的子view的layout发生变化时也播放动画,用法如下。
LayoutTransition transition = container.getLayoutTransition();
transition.enableTransitionType(LayoutTransition.CHANGING);
四种容器转换动画类型
1.View本身的出现动画;
2.消失动画;
3.由于新增了其他View而需要改变位置的动画;
4.由于移除了其他View而需要改变位置的动画。
将动画设置到LayoutTransition 的方法
通过setAnimator() 方法把它们设置进一个 LayoutTransition 对象中去。
设置的时候需要一个 Animator 对象和一个常数:
APPEARING—— A flag indicating the animation that runs on items that are appearing in the container.
CHANGE_APPEARING——A flag indicating the animation that runs on items that are changing due to a new item appearing in the container.
DISAPPEARING——A flag indicating the animation that runs on items that are disappearing from the container.
CHANGE_DISAPPEARING——A flag indicating the animation that runs on items that are changing due to an item disappearing from the container.
当然你可以自己定义这四种事件类型的动画,也可以使用默认的动画。
最后通过setLayoutTransition(LayoutTransition)方法把这些动画以一个 LayoutTransition 对象的形式设置给一个ViewGroup即可。
完整代码
功能描述:当点击添加动画的按钮时,会在LinearLayout 里面动态的添加上很多按钮(按钮出现的动画是:由小到大、旋转、透明),而这些动画都是通过定义在res下面的animator文件里的属性定义实现的。
主函数
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mButtonAdd;
private LinearLayout linearLayout;
int count;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonAdd = (Button) findViewById(R.id.button);
linearLayout = (LinearLayout) findViewById(R.id.linearlayout);
mButtonAdd.setOnClickListener(this);
LayoutTransition transition=new LayoutTransition();
transition.getDuration(2000);
transition.setAnimator(LayoutTransition.APPEARING, AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.animator_scale));
transition.setAnimator(LayoutTransition.CHANGE_APPEARING, transition.getAnimator(LayoutTransition.CHANGE_APPEARING));
transition.setAnimator(LayoutTransition.DISAPPEARING, transition.getAnimator(LayoutTransition.DISAPPEARING));
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,transition.getAnimator(LayoutTransition.CHANGE_DISAPPEARING));
linearLayout.setLayoutTransition(transition);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
count++;
Button btn = new Button(MainActivity.this);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
btn.setLayoutParams(params);
btn.setText("按钮" + count);
/*
下面这四条语句是按钮最开始的样式,前两句是表示按钮开始的时候是没有显示的,后两句是表示按钮出现后是以30度
和45度形式显现的,但最后都会被设置在res下面的animator中的animator_scale.xml文件里的相应属性掩盖。(即最后呈现的是文件里的属性)
*/
btn.setScaleX(0f);
btn.setScaleY(0f);
btn.setRotationX(30);
btn.setRotationY(45);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
linearLayout.removeView(v);
}
});
linearLayout.addView(btn);
break;
}
}
}
新建animator.xml文件
在res下面建一个animator文件夹,然后在这个文件夹里面写一个animator_scale.xml文件,最后在主函数里进行调用。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="0.2"
android:valueTo="1"></objectAnimator>
<objectAnimator
android:duration="1000"
android:propertyName="scaleY"
android:valueFrom="0.2"
android:valueTo="1"></objectAnimator>
<objectAnimator
android:duration="1000"
android:valueFrom="0"
android:valueTo="360"
android:propertyName="rotationX"></objectAnimator>
<objectAnimator
android:duration="1000"
android:valueFrom="0"
android:valueTo="360"
android:propertyName="rotationY"></objectAnimator>
<objectAnimator
android:duration="1000"
android:valueFrom="0"
android:valueTo="1"
android:propertyName="alpha"></objectAnimator>
</set>
布局
注意:在这个布局里面有两个LinearLayout ,嵌套的LinearLayout 是为了放入的添加按钮的。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="#FFB6C1"
android:orientation="vertical" tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加动画"/>
<LinearLayout
android:id="@+id/linearlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
></LinearLayout>
</LinearLayout>
在这个程序里用到了Animator,如果想了解它的的详细介绍,可查看:http://blog.youkuaiyun.com/liujiaoruiit/article/details/48595159