[Android]Fragment自定义动画、动画监听以及兼容性包使用
Fragment是Android在API 11之后加入的一个组件,对提高Android开发中的布局合理性和布局效率都有很大作用,尤其是在Android平板等大屏幕设备的开发中,Fragment的引入能更好地利用较大的屏幕空间。
本文主要说明Fragment使用简介、Fragment自定义动画的使用、监听动画过程、以及在较低API版本中使用兼容性包来实现上述功能。
首先简要说一下添加Fragment方法,可以直接在Activity的布局文件中加入fragment标签
<fragment
android:name="com.example.test.ExampleFragment"
android:id="@+id/example_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
也可以在代码中将Fragment加入已存在的ViewGroup中
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
ft.add(R.id.fragment_container, fragment);
ft.commit();
而在Fragment类中加入UI则只需要在Fragment类中重写onCreateView方法,并在方法中添加布局文件
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.example_fragment, container, false);
}
第二,为Fragment添加动画。添加自带动画效果很简单,只需要在添加Fragment或者进行Fragment动作变化时为FragmentTransaction对象添加setTransaction()方法,自带的动画效果有:FragmentTransaction.TRANSIT_FRAGMENT_OPEN、TRANSIT_FRAGMENT_CLOSE、TRANSIT_FRAGMENT_FADE等等,任君选择。而除了add()添加fragment方法之外还有replace()、show()、hide()等不同的操作。
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, fragment, "ExampleFragment")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
如果这些自带动画效果不能满足我们的要求,比如想要实现Fragment的滑动效果,就需要自定义动画了。添加自定义动画的方法是setCustomAnimations(int enter, int exit),这两个参数分别是进入和离开两个动画的资源文件ID。使用方法如下,注意setCustomAnimations方法必须在replace或者add等方法之前被调用。
FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();
然后就是自己定义动画文件fragment_in.xml和fragment_out.xml了,但是这里有个非常要注意的问题,原生库android.app.Fragment支持的动画不再是以前的含有<translate>标签的动画了,而是新的<objectAnimator>标签。比如定义向左滑入动画我们以前都是这么写的
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="100%p"
android:toXDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="300"/>
</set>
但是如果在原生Fragment动画中使用此描述文件,会出现不认识translate标志的错误,新的动画描述方法如下:
<?xml version="1.0" encoding="utf-8"?>
<set>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="x"
android:valueType="floatType"
android:valueFrom="1280"
android:valueTo="0"
android:duration="300"/>
</set>
这样写进入和离开动画效果就没有问题了。在这里有个问题我暂时没明白,在使用<translate>时可使用fromXDelta="100%p"这样的方式以百分比的形式定义位置,而在<objectAnimator>貌似没找到这种相对的定义方法,有高手知道还请赐教~
至于为什么Google要这么蛋疼弄一种新的动画定义方式我也不特别能理解。。。就跟Animation和Animator一样。
第三,在我们自定义好动画后,有时候需要判断我的动画有没有开始?有没有结束?这时就需要对动画执行状态进行监听。对此,可以在Fragment类中重写一个onCreateAnimator()方法,这个方法会在执行动画时被调用。在方法中设置动画Animator的监听器。如下:
@Override
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) { final Animator anim = AnimatorInflater.loadAnimator(getActivity(), nextAnim);
anim.addListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationStart(Animator animation)
{
//动画开始
} @Override
public void onAnimationEnd(Animator animation)
{
//动画结束
}
});
return anim;
}
最后,上面说的一切都是在API 11也就是3.0以上的系统中原生支持的,如果我们需要在支持低于3.0系统的app中使用Fragment该怎么办呢?这时的自定义动画和动画监听又将如何?下面来说明这些问题。
解决的方法很简单,原生不足,兼容来补。为了增加对低版本系统的兼容性,Android提供了一个兼容性库,叫做android-support-v4.jar(有了这个库,妈妈再也不用担心我的应用兼容性了),这个包现在在新建工程时应该就带着了,而其对应的兼容性包android.support.v4.app中,就包含有Fragment这个类。也就是说,支持老版本的app(MiniSDK选API 11以下)在使用Fragment时,就直接继承自android.support.v4.app.Fragment,而不继承自原生的android.app.Fragment。同样,FragmentTransaction和FragmentManager来自这个兼容性包,这里要注意的是来自这个包的获取FragmentManager的方法不再是getFragmentManager(),而是getSupportFragmentManager()。
使用这个兼容性包之后,添加自定义动画的过程仍和之前一致,不过由于是低版本的兼容性包,所以描述动画的xml文件中,我们又需要用回以前<translate>的描述方法,其实这对用习惯这种动画定义方法的人来说还是比较方便的。(又可以用相对位置定义了。。。)
  使用兼容性包的Fragment我们仍然想监听动画状态,但这时发现继承自兼容性包的Fragment已经找不到可重写的方法onCreateAnimator()了,这时,会出现另一个更老、我们更熟悉的方法onCreateAnimation(),同样,重写这个方法并在其中为Animation对象设置监听器以实现对动画状态的监听。
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { Animation anim = AnimationUtils.loadAnimation(getActivity(), nextAnim); anim.setAnimationListener(new AnimationListener() { public void onAnimationStart(Animation animation) {
//动画开始
} public void onAnimationRepeat(Animation animation) {
//动画循环
} public void onAnimationEnd(Animation animation) {
//动画结束
}
}); return anim;
}
以上,就是我总结的Fragment动画相关的一些内容。
[Android]Fragment自定义动画、动画监听以及兼容性包使用的更多相关文章
- Android之自定义AlertDialog无法监听控件
		参考:http://www.cnblogs.com/511mr/archive/2011/10/21/2220253.html 要做一个自定义的弹出框,以前都是用一个Activity来实现,总觉得不是 ... 
- UI设计篇·入门篇·简单动画的实现,透明动画/旋转动画/移动动画/缩放动画,混合动画效果的实现,为动画设置监听事件,自定义动画的方法
		基本的动画构成共有四种:透明动画/旋转动画/移动动画/缩放动画. 配置动画的方式有两种,一种是直接使用代码来配置动画效果,另一种是使用xml文档配置动画效果 相比而言,用xml文档写出来的动画效果,写 ... 
- Android属性动画的监听事件
		整体很简单,直接上代码吧.activity_main.xml: <?xml version="1.0" encoding="utf-8"?> < ... 
- AndroidUI 视图动画-混合动画效果 (AnimationSet)/动画效果监听
		在前面介绍了几种动画效果:透明动画效果(AlphsAnimation).移动动画效果(TranslateAnimation).旋转动画效果(RotateAnimation).缩放动画效果(ScaleA ... 
- android BroadcastReceiver ACTION_TIME_TICK 系统时间监听不到
		android BroadcastReceiver ACTION_TIME_TICK 系统时间监听不到 今天做android上的消息推送,启动了一个独立service,然后在里面监听系统的ACTION ... 
- android的Home键的监听封装工具类(一)
		android的Home键的监听封装: package com.gzcivil.utils; import android.content.BroadcastReceiver; import andr ... 
- uniapp仿h5+fire自定义事件触发监听
		仿h5+fire自定义事件触发监听 uni-app调用 event.js 源码记录(点击查看) 1.js下载地址 [event.js](https://ext.dcloud.net.cn/plugin ... 
- Spring Boot(六)自定义事件及监听
		事件及监听并不是SpringBoot的新功能,Spring框架早已提供了完善的事件监听机制,在Spring框架中实现事件监听的流程如下: 自定义事件,继承org.springframework.con ... 
- 另辟思路解决 Android 4.0.4 不能监听Home键的问题
		问题描述: 自从Android 4.0以后,开发人员是不能监听和屏蔽Home键的,对于KEYCODE_HOME,官方给出的描述如下: Home key. This key is handled by ... 
随机推荐
- Javascript和jquery事件--鼠标事件的小结
			1.鼠标事件的主要事件应该是mouseup, mousedown, mousewheel, mousemove, mouseover, moveout. <1>其中mouseup和mous ... 
- Java Timer TimerTask Example(java Timer的例子)
			Java java.util.Timer is a utility class that can be used to schedule a thread to be executed at cert ... 
- [Angular] FadeIn and FadeOut animation in Angular
			To define an Angular Animation, we using DSL type of language. Means we are going to define few anim ... 
- leetcode——Reverse Linked List II 选择链表中部分节点逆序(AC)
			Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1-> ... 
- Let's do our own full blown HTTP server with Netty--转载
			原文地址:http://adolgarev.blogspot.com/2013/12/lets-do-our-own-full-blown-http-server.html Sometimes ser ... 
- libjpeg用法
			libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码.JPEG编码和其他的JPEG功能的实现.这个库由独立JPEG工作组维护.最新版本号是6b,于1998年发布.可以参考维基百科关 ... 
- OC学习篇之---文件的操作
			今天我们来介绍OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了 ... 
- 用CSS实现阴阳八卦图等图形
			CSS还是比较强大的,可以实现中国古典的"阴阳八卦图"等形状. 正方形 #rectangle { width: 200px; height: 100px; backgrount-c ... 
- [原]MFC中DIALOG(对话框)程序响应加速键(快捷键)
			[原]MFC中DIALOG(对话框)程序响应加速键(快捷键) 2014-8-6阅读266 评论0 新建一个对话框程序,项目名为Test,删除默认确定,取消和静态文本框控件.添加一个按钮,Caption ... 
- php实现 称砝码(背包)
			php实现 称砝码(背包) 一.总结 一句话总结: 1.dp的实质是什么? 刷表啊,用空间换时间 把表画出来会做得更快 13 //动态规划就是一个表 14 //至于这个表的更新就是上面层的表更新下面层 ... 
