文章来源

在Android中,最简单的动画就是补间动画了。通过补间动画,可以对一个控件进行位移、缩放、旋转、改变透明度等动画。但是补间动画只能对一个控件使用,如果要对某一组控件播放一样的动画的话,可以考虑layout-animation。

LayoutAnimation

layout-animation可由xml和代码两种方式配置:

XML配置

由于layout-animation是对于某一组控件的操作,就需要一个基本的动画来定义单个控件的动画。另外还可以定义动画的显示顺序和延迟:

 <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"android:delay="30%"android:animationOrder="reverse"android:animation="@anim/slide_right" />

其中

android:delay表示动画播放的延时,既可以是百分比,也可以是float小数。
android:animationOrder表示动画的播放顺序,有三个取值normal(顺序)、reverse(反序)、random(随机)。
android:animation指向了子控件所要播放的动画。
上述步骤完成之后,就可以将layout-animation应用到ViewGroup中,xml布局添加下面一行就ok:

android:layoutAnimation="@anim/list_anim_layout"

这样在加载布局的时候就会自动播放layout-animtion。

代码配置
如果在xml中文件已经写好LayoutAnimation,可以使用AnimationUtils直接加载:

 AnimationUtils.loadLayoutAnimation(context, id)

另外还可以手动java代码编写,如:

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

通过代码设置可以达到同样效果。

扩展

前几天遇到一个需求,将动画顺序改为左上到右下角展开,例如Material Design中这个样子。虽然一个个按顺序播放页可以实现,但也太low了,就希望能够找一个简便的方法。(PS. 个人崇尚简约就是美)

仔细观察,很明显就是一个LayoutAnimation,但是LayoutAnimation默认只有三种顺序,即顺序逆序和随机,不能满足需求。去翻翻源码看它是怎么实现的,有没有提供方法自定义顺序?结果翻到了一个LayoutAnimationController#getTransformedIndex(AnimationParameters params)方法,返回值就是播放动画的顺序。并且这个方法是protected的,明显就是可由子类来扩展。既然找到了方法,那么就去实现它:

    /*** custom LayoutAnimationController for playing child animation* in any order.**/
public class CustomLayoutAnimationController extends LayoutAnimationController {// 7 just lucky number
public static final int ORDER_CUSTOM  = 7;private Callback onIndexListener;public void setOnIndexListener(OnIndexListener onIndexListener) {this.onIndexListener = onIndexListener;
}public CustomLayoutAnimationController(Animation anim) {super(anim);
}public CustomLayoutAnimationController(Animation anim, float delay) {super(anim, delay);
}public CustomLayoutAnimationController(Context context, AttributeSet attrs) {super(context, attrs);
}/*** override method for custom play child view animation order
*/
protected int getTransformedIndex(AnimationParameters params) {if(getOrder() == ORDER_CUSTOM && onIndexListener != null) {return onIndexListener.onIndex(this, params.count, params.index);} else {return super.getTransformedIndex(params);}
}/*** callback for get play animation order**/
public static interface Callback{public int onIndex(CustomLayoutAnimationController controller, int count, int index);
}
}

通过复写getTransformedIndex方法,添加自定义顺序ORDER_CUSTOM,让callback自定义控件播放动画的顺序,即可以达到任何想要的效果。

总结

Android在设计的时候,提供了很好的扩展性。各种组件都可以按需求扩展。可能用的更多的是还是View.onDraw(Canvas canvas)方法,但不仅仅是view,对于其他组件,也可以随意的扩展。很多时候,并不一定需要自定义很多空间、功能之类的,往往扩展一些简单的组件就能达到自己想要的结果。

Android LayoutAnimation使用及扩展相关推荐

  1. android 程序的后缀,Android Studio项目文件的扩展名是什么?

    使用项目根目录中build.gradle文件的import projectfunction(而不是文件夹本身!)在Android Studio中再次打开项目. 我认为".iml"是 ...

  2. 暴力突破 Gradle 自动化项目构建(八)- Android 对 Gradle 的扩展:Variants、Transform

    一.前言 上一篇学习了如何自定义 Gradle 插件,本篇我们来学习下 Android 对 Gradle 的扩展:Variants(变体)以及 Transform.通过扩展可以让我们在自定义 Grad ...

  3. android 获取文件的扩展名和去掉文件的扩展名

    android 获取文件的扩展名和去掉文件扩展名的小例子,在此记录一下,需要的朋友可以参考一下: /** Java文件操作 获取文件扩展名* */public static String getExt ...

  4. Windows Azure Mobile Services增加了对 Android的支持并扩展其适用范围至东亚地区

    我们的Mobile Services使开发人员很容易地开发丰富多彩的移动应用程序.使用Mobile Services ,开发人员不仅能够连接其应用程序到 Windows Azure 上易扩展又安全的后 ...

  5. Android Kotlin Coroutines ktx扩展

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119831011 本文出自[赵彦军的博客] 文章目录 lifecycle 扩展 vi ...

  6. Android实现ExpandableTextView可扩展TextView

    介绍 在应用开发中,总会遇到一些类似于公告,说明等长文本的TextView,但是为了排版美观等因素,我们通常是要隐藏后半部的文本,只显示部分文字,然后在尾部会提供用户一个扩展/收缩的按钮,使得文本框可 ...

  7. android浮动按钮_Android扩展浮动操作按钮

    android浮动按钮 Extended Floating Action Button is the newly introduced class with Material Components l ...

  8. Android接入环信扩展消息显示头像、昵称

    Android环信官方集成文档:http://docs.easemob.com/im/200androidclientintegration/10androidsdkimport 我在项目里集成环信时 ...

  9. android notifydatasetchanged 刷新错误,android – notifyDataSetChanged()不刷新可扩展列表视图...

    我正在使用Expandable ListView,其中的数据通过Sqlite数据库填充.我已经选择从ExpandableListView中删除一个组,它实际上删除了数据库中的相应行.但是活动不会刷新, ...

最新文章

  1. c++ make_pairpair
  2. 理解并取证:以太通道的动态协商机制的工作原理
  3. 2021年8月Web服务器排行榜:Nginx牛市上升
  4. lib和dll的区别、生成以及使用详解
  5. eclipse maven jetty启动修改默认端口
  6. 给数组添加自定义方法
  7. dll文件:关于MFC程序不能定位输入点
  8. Trie树(字典树)详细知识点及其应用
  9. c语言 空格_C语言100题集合-ex003
  10. python post form data_python实现发送form-data数据的方法详解
  11. C++笔记-lambda表达式需要注意的地方
  12. linux内核中断向量表,Linux内核中断之中断向量表IDT的初始化
  13. linux ora -03113,ORA-03113解决方法
  14. codesys 轴程序
  15. SEO采集系统-SEO采集工具自动采集伪原创发布
  16. png转icon java_原创 | Java图片处理:ico格式转 PNG/JPG等格式
  17. 一个毕业设计 儿童趣味数学 app
  18. autoit3 ie.au3 函数之——_IEErrorNotify
  19. ORACLE实现MySQL中substring_index函数功能
  20. 苹果发布黄色版 iPhone 14,定价 5999 元起;大神李沐被曝离职投身大模型创业;Atlassian 裁员 |极客头条

热门文章

  1. 浅谈SD-WAN未来的发展方向
  2. serverlet filter
  3. c++入门之 再话类
  4. CryptoZombies学习笔记——Lesson4
  5. dataTables基础函数变量
  6. ASP.NET比较常用的26个性能优化技巧
  7. AVFoundation之如何从摄像头获取图像
  8. 翻译器DIY它———算在英文文本中的单词数,字符和行数
  9. Android核心分析 之一分析方法论探讨之设计意图
  10. [已经完美解决]IE下 'document.getElementById(...)' is null