android:animateLayoutChanges属性

Posted xiaoqiang_0719

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android:animateLayoutChanges属性相关的知识,希望对你有一定的参考价值。

一、android:animateLayoutChanges属性

在API 11之后,Android为了支持ViewGroup类控件,在添加和移除其中控件时自动添加动画,为我们提供了一个非常简单的属性:android:animateLayoutChanges=[true/false],所有派生自ViewGroup的控件都具有此属性,只要在XML中添加上这个属性,就能实现添加/删除其中控件时,带有默认动画了。 
我们来看下这次的效果图:


然后来看看具体代码是如何来做的:

1、main.xml布局代码

[html]   view plain  copy  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.               android:layout_width="match_parent"  
  4.               android:layout_height="match_parent"  
  5.               android:orientation="vertical">  
  6.   
  7.     <LinearLayout  
  8.             android:layout_width="match_parent"  
  9.             android:layout_height="wrap_content"  
  10.             android:orientation="horizontal">  
  11.   
  12.         <Button  
  13.                 android:id="@+id/add_btn"  
  14.                 android:layout_width="wrap_content"  
  15.                 android:layout_height="wrap_content"  
  16.                 android:text="添加控件"/>  
  17.   
  18.         <Button  
  19.                 android:id="@+id/remove_btn"  
  20.                 android:layout_width="wrap_content"  
  21.                 android:layout_height="wrap_content"  
  22.                 android:text="移除控件"/>  
  23.     </LinearLayout>  
  24.   
  25.   
  26.     <LinearLayout  
  27.             android:id="@+id/layoutTransitionGroup"  
  28.             android:layout_width="match_parent"  
  29.             android:layout_height="wrap_content"  
  30.             android:animateLayoutChanges="true"  
  31.             android:orientation="vertical"/>  
  32.   
  33. </LinearLayout>  
布局代码很简单,两个按钮,最底部是一个LinearLayout做为动态添加btn的container,注意,我们给它添加了android:animateLayoutChanges="true"也就是说,它内部的控件在添加和删除时,是会带有默认动画。

2、MyActivity代码

MyActivity的代码也很简单,就是在点击添加按钮时向其中动态添加一个btn,在点击删除按钮时,将其中第一个按钮给删除。
[java]   view plain  copy  
  1. public class MyActivity extends Activity implements View.OnClickListener   
  2.     private LinearLayout layoutTransitionGroup;  
  3.   
  4.     private int i = 0;  
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState)   
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.   
  10.         layoutTransitionGroup = (LinearLayout) findViewById(R.id.layoutTransitionGroup);  
  11.         findViewById(R.id.add_btn).setOnClickListener(this);  
  12.         findViewById(R.id.remove_btn).setOnClickListener(this);  
  13.       
  14.   
  15.     private void addButtonView()   
  16.         i++;  
  17.         Button button = new Button(this);  
  18.         button.setText("button" + i);  
  19.         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,  
  20.                 ViewGroup.LayoutParams.WRAP_CONTENT);  
  21.         button.setLayoutParams(params);  
  22.         layoutTransitionGroup.addView(button, 0);  
  23.       
  24.   
  25.     private void removeButtonView()   
  26.         if (i > 0)   
  27.             layoutTransitionGroup.removeViewAt(0);  
  28.           
  29.         i--;  
  30.       
  31.   
  32.     @Override  
  33.     public void onClick(View v)   
  34.         if (v.getId() == R.id.add_btn)   
  35.             addButtonView();  
  36.           
  37.         if (v.getId() == R.id.remove_btn)   
  38.             removeButtonView();  
  39.           
  40.   
  41.       
  42.   
代码很简单就不再细讲了。

由上面的效果图可见,我们只需要在viewGroup的XML中添加一行代码android:animateLayoutChanges=[true]即可实现内部控件添加删除时都加上动画效果。 
下面我们来做下对比,如果把上面LinearLayout中的android:animateLayoutChanges=[true]给去掉的效果是怎样的?大家来看下原始添加控件是怎样的,就知道默认动画效果是什么了。 
在没加android:animateLayoutChanges=true时:


可见,在添加和删除控件时是没有任何动画的。经过对比就可知道,默认的进入动画就是向下部控件下移,然后新添控件透明度从0到1显示出来。默认的退出动画是控件透明度从1变到0消失,下部控件上移。 

源码在文章底部给出

二、LayoutTransaction

1、概述

上面虽然在ViewGroup类控件XML中仅添加一行android:animateLayoutChanges=[true]即可实现内部控件添加删除时都加上动画效果。但却只能使用默认动画效果,而无法自定义动画。 
为了能让我们自定义动画,谷歌在API 11时,同时为我们引入了一个类LayoutTransaction。 
要使用LayoutTransaction是非常容易的,只需要三步: 

第一步:创建实例

[html]   view plain  copy  
  1. LayoutTransaction transitioner

    以上是关于android:animateLayoutChanges属性的主要内容,如果未能解决你的问题,请参考以下文章