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方法,并在方法中添加布局文件

    @Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubreturn 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的监听器。如下:

    @Overridepublic Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {final Animator anim = AnimatorInflater.loadAnimator(getActivity(), nextAnim);anim.addListener(new AnimatorListenerAdapter(){@Overridepublic void onAnimationStart(Animator animation){//动画开始
            }@Overridepublic 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对象设置监听器以实现对动画状态的监听。

    @Overridepublic 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动画相关的一些内容。

转载于:https://www.cnblogs.com/lcyty/p/3383960.html

[Android]Fragment自定义动画、动画监听以及兼容性包使用相关推荐

  1. Android之自定义AlertDialog无法监听控件

    参考:http://www.cnblogs.com/511mr/archive/2011/10/21/2220253.html 要做一个自定义的弹出框,以前都是用一个Activity来实现,总觉得不是 ...

  2. android设备外接键盘实现监听事件

    需求分析 产品为一款基于android的交互终端,现在已经在android嵌入式系统上运行了一个第三方的交易软件(没有源码).在产品量产投入使用时,可以实现以下两点需求: 设备开机时自动启动交易App ...

  3. Android实现双击事件的监听

    本文转自:Android实现双击事件的监听 Android实现view的双击事件监听,一般使用的场景,列表双击顶部回到第一条! 双击监听 /*** view双击监听事件*/ public class ...

  4. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键

    本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){         ...

  5. android 窗口监听按键,Android编程实现Dialog窗体监听的方法

    本文实例讲述了Android编程实现Dialog窗体监听的方法.分享给大家供大家参考,具体如下: 今天做了一个Dialong窗体监听包括窗体内的xml监听. 效果图: test.class代码 pac ...

  6. android 关机消息广播,Android开机、关机播音监听

    Android开机.关机广播监听 一.开机广播的监听 1.在AndroidManifest.xml文件注册接收开机广播 2.在BroadcastReceiver里执行要做的事情 public clas ...

  7. Android USB摄像头插拔监听

    Android USB摄像头插拔监听 一.简要介绍 二.使用广播监听USB摄像头插拔情况 1.注册监听USB设备插拔广播 2.判断UsbDevice是否是Camera设备 (重点) 二.通过UsbMa ...

  8. Android DownloadManager下载完成事件监听(系列4)

     Android DownloadManager下载完成事件监听(系列4) 我在之前写了写一些关于Android DownloadManager 的文章: (系列1)<Android大数据. ...

  9. Android的Usb设备的监听(Dev)外设端口的判定以及耳机的插拔

    最近在公司用到外设,需要判断接入的外设的VendorId和ProductId,然后给大家说一下自己的学习成果把 ,首先我门可以通过android.hardware.usb.action.USB_STA ...

最新文章

  1. 每次输出日志前需要判断日志的级别吗?
  2. windows怎么更改系统默认编码为utf-8?(避免编译从linux系统弄过来的c文件printf出现乱码问题)(beta版:使用unicode utf-8提供全球语言支持)
  3. python zipfile 模块下中文乱码 '╡┌╥╗╒┬_╒╨▒Ω╣½╕µ.docx'
  4. 【ZZ】字符编码笔记:ASCII,Unicode和UTF-8
  5. 在Ubuntu上安装RealPlayer的方法
  6. jQuery动态设置样式List item
  7. java字符串为空抛出异常_Java 判断字符串是否为空的四种方法,及效率比较。
  8. linux 下进程和线程指定CPU运行
  9. Storm集群安装Version1.0.1开启Kerberos
  10. linux操作系统巡检报告,linux服务器巡检报告
  11. 算法(Algorithms)第4版 练习 2.1.24
  12. 在shell中获取当前机器的ip地址
  13. 监控三个指标 并不代表你能监控Tuxedo
  14. JavaScript实现map
  15. Python的线程如何理解
  16. 浅议初中语文微写作(语文教师论文)
  17. Google地图切片TMS格式,本地使用
  18. 根据已经commit的数据,进行leader和peon之间的同步
  19. msvcp140.dll丢失的详细修复教程
  20. 复旦大学-陈果老师笔记

热门文章

  1. 【洛谷5251】[LnOI2019] 第二代图灵机(线段树+ODT)
  2. Android子线程中更新UI的4种方法
  3. Consumer设计-high/low Level Consumer
  4. 经典机器学习算法系列3-k近邻算法
  5. 怎样新建Oracle数据库
  6. [3]工欲善其事必先利其器-------UML常用的图(三)
  7. 《侠侣天下》资料片武魂大揭晓
  8. 利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆
  9. shell 脚本常用参数
  10. Expected a key while parsing a block mapping. assets: ^