layoutAnimation动画

LayoutAnimation

想一想我们以前使用的动画都是针对一个控件的动画,没有看到怎么让一个GroupView有动画的效果吧。今天我们就来学习一下layoutAnimation的魅力。虽然听起来高大上,但是实际上却不难哦!

废话不多说,还是老规矩,先上菜:

这里写图片描述

好,我们就进入正题:

我们先看看这个动画的XML文件,因为这个动画的XML文件写起来简单方便。所以我就先讲这个,定义一个动画的xml文件在anim文件夹下。

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="1"
    android:animationOrder="normal"
    android:animation="@anim/slide_in_left"/>

上面这段代码是LayoutAnimation的动画,下面的代码是android:animation=”@anim/slide_in_left”中的代码,就是具体的动画效果是如何构成的:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="1000">
    <translate android:fromXDelta="-50%p" android:toXDelta="0"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"/>
</set>

我们来学习一下这里面的属性意义:

我们先看最上面的代码,其中的第一个属性:delay=”1”,是什么意思呢?就是表明的是这个布局动画的持续时间是其包含的动画即:android:animation=”@anim/slide_in_left”中动画时间的倍数,就是说其包含的动画的时间只是一个基本时间量,动画的时间是按照delay的值*包含动画的时间。可以是小数,也可以是整数。第二个属性:animationOrder=”normal”,动画的排序,什么意思,就是和我们学习的属性动画中的rePeatMode一样,“normal”表示的按照指定的方向运行,“reverce”表示动画就反向运行”random“:表示随机效果,这个效果不是在正常和方向中的其中一个,而是listview中的任何一个条目都有可能是第一个有动画效果的。

我们再来学习第二段代码中到的属性,看到这里,想必大家都已经知道这些属性了,不过,还是要讲一次,加深我们的记忆嘛,duration=”1000“表示动画的持续时间1秒,traslate标签表示的移动的动画,fromXDelta=”-50%p表示的是从屏幕左边负的一半屏幕宽度位置到的地方为动画的起点。toXDelta=”0”表示动画的结束位置在屏幕的左边缘。android:fromAlpha=”0.0”:表示动画开始时控件的透明度为0,即完全透明,toAlpha=”1.0”:表示动画结束时控件的透明度为1,即完全不透明。

下面再看看布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
    android:id="@+id/addlist"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="添加数据"/>

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layoutAnimation="@anim/layout_animation"/>
</LinearLayout>

布局文件就比较简单了,我就不在多说了,一个按钮,一个ListView布局,下面我就出大招了:

public class MainActivity extends Activity {

private ListView mListView;
private ArrayAdapter mAdapter;
private Button mAddListBtn;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mListView = (ListView) findViewById(R.id.listview);
    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData());
    mListView.setAdapter(mAdapter);

    mAddListBtn = (Button)findViewById(R.id.addlist);
    mAddListBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mAdapter.addAll(getData());
        }
    });
}

private List<String> getData() {
    List<String> data = new ArrayList<String>();
    data.add("三更灯火五更鸡,");
    data.add("正是男儿读书时。");
    data.add("黑发不知勤学早,");
    data.add("白首方悔读书迟。");
    data.add("九州生气恃风雷,");
    data.add("万马齐喑究可哀。");
    data.add("我劝天公重抖擞,");
    data.add("不拘一格降人才。");

    return data;
  }
}

activity一加载,就将数据添加到adapter适配器中,同时展示到List View中,点击按钮,就将数据再次添加到适配器中。逻辑比较的简单,我就不多说了,我想讲的重点是,想必即帅又聪明的你们已经发现,在我进入这个activity的时候,listview的条目是从左往右出现,是有动画的,但是当我点击添加数据按钮之后,数据直接出现在屏幕中,并没有动画效果,这就是我想要提醒大家的,这个动画只有在这个布局第一次出现的时候才会有动画,添加数据并不会有动画效果,实际意思呢,就是说,这动画效果这是listView创建的时候出现,和listView里面的数据没有半毛钱关系,记住,是没有半毛钱关系哦。

下面我就接着讲一下,这个动画效果的java代码实现:

首先,xml中layoutAnimation标签所对应的类为LayoutAnimationController;它有两个构造函数:

public LayoutAnimationController(Animation animation)
public LayoutAnimationController(Animation animation, float delay)

很容易理解,animation对应标签中的android:animation属性,delay对应标签中的android:delay属性。

LayoutAnimationController的函数如下:
/**
 * 设置animation动画
 */
public void setAnimation(Animation animation)
/**
 * 设置单个item开始动画延时
 */
public void setDelay(float delay)
/**
 * 设置viewGroup中控件开始动画顺序,取值为ORDER_NORMAL、ORDER_REVERSE、ORDER_RANDOM
 */
public void setOrder(int order)

同样以上面的例子为例,把xml实现改成代码实现。由于我们要代码实现layoutAnimation,所以我们不再需要写layoutAnimation的xml了,只需要一个动画的animation:(slide_in_left.xml)

<ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

看重点哦,这里的ListView没有android:layoutAnimation=”@anim/layout_animation”属性,因为所有有关LayoutAnimation的部分都是利用代码来实现的;

 //代码设置通过加载XML动画设置文件来创建一个Animation对象;
    Animation animation= AnimationUtils.loadAnimation(this,R.anim.slide_in_left);   //得到一个LayoutAnimationController对象;
    LayoutAnimationController controller = new LayoutAnimationController(animation);   //设置控件显示的顺序;
    controller.setOrder(LayoutAnimationController.ORDER_REVERSE);   //设置控件显示间隔时间;
    controller.setDelay(0.3f);   //为ListView设置LayoutAnimationController属性;
    mListView.setLayoutAnimation(controller);
    mListView.startLayoutAnimation();

这里我就只贴关键代码了,其他的代码和上面的例子一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值