Android 布局动画之LayoutAnimation与LayoutTransition

概述

在Android的动画体系中,有补间动画,帧动画和属性动画,但是这些动画都是针对单个对象的,如果相对ViewGroup作动画,就要用到布局动画了.

LayoutAnimation

LayoutAnimation 是API Level 1 就已经有的,LayoutAnimation是对于ViewGroup控件所有的child view的操作.下面是官方的一个示意图:

LayoutAnimation
也就是说它是用来控制ViewGroup中所有的child view 显示的动画。LayoutAnimation动画可以直接在xml中定义:

  • 定义layoutAnimation
<!--anim/list_item_slide_layout_animation-->
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/slide_in_from_left"
    android:animationOrder="random"
    android:delay="1"/>
<!--
delay : ViewGroup 中单个Item动画的开始延时,取值是android:animation 所指定动画时长的倍数,可以是float,也可以是百分数,默认0.5
比如slide_in_from_left中定义的动画时长是500ms,这里delay=1,那么在上一个动画执行之后延时500ms执行下一个tem的动画

animationOrder : 动画开始顺序,normal(正序)、reverse(倒序)、random(随机)

animation : 指定动画资源animation,注意不能使用animator
-->

可以通过下面两种方式加载

一. 直接在ViewGroup的 layout xml 文件中设置:

android:layoutAnimation="@anim/list_item_slide_layout_animation"

二. 使用代码设置

Animation animation = AnimationUtils.loadAnimation(mActivity,R.anim.slide_in_from_left);
LayoutAnimationController animationController = new LayoutAnimationController(animation,
         1f);
animationController.setInterpolator(new AccelerateDecelerateInterpolator());
animationController.setOrder(LayoutAnimationController.ORDER_RANDOM);

mList.setLayoutAnimation(animationController);
mList.startLayoutAnimation();

同时,系统也提供了gridLayoutAnimation用于给Gridview设置布局动画,
对应的标签为gridLayoutAnimation,类为GridLayoutAnimationController

  • 注意:
  1. 需要注意的是布局动画,在创建ViewGroup的时候生效,后续添加的子View是没有动画效果的.
  2. API 1的时候引进的,不用担心兼容性问题,正是如此,也只支持animation,不支持Animator

LayoutTransition

LayoutTransition 是API Level 11 才出现的。LayoutTransition的动画效果,只有当ViewGroup中有View添加、删除、隐藏、显示的时候才会体现出来。
LayoutTransition是一个布局改变动画

layoutChanges

LayoutTransition也有两种方式添加

  • 在xml中直接添加
// 使用系统默认的LayoutTransition动画
android:animateLayoutChanges="true"  
  • 在代码中使用(API 11 后)
// 使用系统默认的LayoutTransition动画
LayoutTransition mTransitioner = new LayoutTransition();  
mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, @animRes animtor);//设置动画
mViewGroup.setLayoutTransition(mTransitioner);  
  • 同时,可以给LayoutTransition设置监听器
mTransitioner.addTransitionListener(new LayoutTransition.TransitionListener(){//...}

自定义LayoutTransition三部曲

一. 定义LayoutTransition实例

mTransitioner = new LayoutTransition();  

二. 设置Animator

 mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, animOut);

三. 设置进ViewGroup

layoutTransitionGroup.setLayoutTransition(mTransitioner); 

其中第二步中的第一个参数,有五种具体如下:

  • LayoutTransition.APPEARING:View添加时的动画。
  • LayoutTransition.CHANGE_APPEARING:View添加导致布局改变时整个布局容器的动画。
  • LayoutTransition.DISAPPEARING:View消失时的动画。
  • LayoutTransition.CHANGE_DISAPPEARING:View消失导致布局容改变时整个布局容器的动画。
  • LayoutTransition.CHANGE:不是由于View出现或消失造成改变的时候整个布局容器的动画。

相关源码地址:
AndroidAnimations

参考:Android LayoutAnimation 与 LayoutTransition

扩展阅读:在RecyclerView上使用布局动画(Layout animation)
Android LayoutAnimation使用及扩展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值