Android应用——用LayoutTransition在View动态显示和隐藏时候加上动画

来源:互联网 发布:骑马与砍杀捏脸数据 编辑:程序博客网 时间:2024/06/05 05:22

    • 容器布局动画LayoutTransition的介绍
      • 四种容器转换动画类型
      • 将动画设置到LayoutTransition 的方法
    • 完整代码
      • 主函数
      • 新建animatorxml文件
      • 布局

这里写图片描述

容器布局动画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.csdn.net/liujiaoruiit/article/details/48595159

0 0
原创粉丝点击