Android应用——用LayoutTransition在View动态显示和隐藏时候加上动画
来源:互联网 发布:骑马与砍杀捏脸数据 编辑:程序博客网 时间:2024/06/05 05:22
- 容器布局动画LayoutTransition的介绍
- 四种容器转换动画类型
- 将动画设置到LayoutTransition 的方法
- 完整代码
- 主函数
- 新建animatorxml文件
- 布局
- 容器布局动画LayoutTransition的介绍
容器布局动画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文件,最后在主函数里进行调用。
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="together"> <objectAnimator android:duration="1000" android:propertyName="scaleX" android:valueFrom="0.2" android:valueTo="1"></objectAnimator> <objectAnimator android:duration="1000" android:propertyName="scaleY" android:valueFrom="0.2" android:valueTo="1"></objectAnimator> <objectAnimator android:duration="1000" android:valueFrom="0" android:valueTo="360" android:propertyName="rotationX"></objectAnimator> <objectAnimator android:duration="1000" android:valueFrom="0" android:valueTo="360" android:propertyName="rotationY"></objectAnimator> <objectAnimator android:duration="1000" android:valueFrom="0" android:valueTo="1" android:propertyName="alpha"></objectAnimator></set>
布局
注意:在这个布局里面有两个LinearLayout ,嵌套的LinearLayout 是为了放入的添加按钮的。
<LinearLayout xmlns:android="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"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加动画"/> <LinearLayout android:id="@+id/linearlayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" ></LinearLayout></LinearLayout>
在这个程序里用到了Animator,如果想了解它的的详细介绍,可查看:http://blog.csdn.net/liujiaoruiit/article/details/48595159
- Android应用——用LayoutTransition在View动态显示和隐藏时候加上动画
- 用LayoutTransition在View动态显示和隐藏时候加上动画
- android布局中子View添加动态隐藏和显示的动画效果。(LayoutTransition)
- Android View动画显示和隐藏(支持所有View)
- 动画——View Animation,Drawable Animation,Property Animation,LayoutTransition
- Android 动画1--View控件的显示和隐藏效果
- Android 动画2--View异步显示和隐藏
- android 下拉筛选菜单 view的显示和隐藏动画
- Android 动画1--View控件的显示和隐藏效果
- Android 动画1--View控件的显示和隐藏效果
- [Android] View控件显示隐藏动画效果
- Android实现View隐藏显示渐变动画
- Android 动画之LayoutAnimation和LayoutTransition
- View的显示和隐藏动画
- Android容器动画LayoutTransition
- Android 动画之LayoutTransition
- Android布局动画--LayoutTransition
- Android——显示隐藏移动动画
- thinkphp的问题
- 再谈谷歌搜索引擎使用技巧
- 2015 ACM/ICPC Asia Regional Changchun Online (部分)
- 线程池中使用条件变量和信号量的性能比较
- memcache知识梳理
- Android应用——用LayoutTransition在View动态显示和隐藏时候加上动画
- eclipse的环境变量的配置
- Eclipse快捷键大全
- C++ primer 5 笔记3 chapter 3 字符串, 向量和数组
- JSP和SERVLET区别( 转)
- 软件测试管理
- 内核数据结构-----队列kfifo.h (4.0.8)较新的内核版本
- java__反射、批处理、对象拷贝
- 跟着海盗头子创业是一种怎样的体验?