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

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

Android应用——用LayoutTransition在View动态显示和隐藏时候加上动画_第1张图片

容器布局动画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文件,最后在主函数里进行调用。

Android应用——用LayoutTransition在View动态显示和隐藏时候加上动画_第2张图片

"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
    android:ordering="together">
    "1000"
        android:propertyName="scaleX"
        android:valueFrom="0.2"
        android:valueTo="1">

   "1000"
    android:propertyName="scaleY"
    android:valueFrom="0.2"
    android:valueTo="1">

    "1000"
        android:valueFrom="0"
        android:valueTo="360"
        android:propertyName="rotationX">

    "1000"
        android:valueFrom="0"
        android:valueTo="360"
        android:propertyName="rotationY">

    "1000"
        android:valueFrom="0"
        android:valueTo="1"
        android:propertyName="alpha">

布局

注意:在这个布局里面有两个LinearLayout ,嵌套的LinearLayout 是为了放入的添加按钮的。

"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">

    

在这个程序里用到了Animator,如果想了解它的的详细介绍,可查看:http://blog.csdn.net/liujiaoruiit/article/details/48595159

你可能感兴趣的:(日记,Android多媒体应用)