[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方法,并在方法中添加布局文件
@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自定义动画、动画监听以及兼容性包使用相关推荐
- Android之自定义AlertDialog无法监听控件
参考:http://www.cnblogs.com/511mr/archive/2011/10/21/2220253.html 要做一个自定义的弹出框,以前都是用一个Activity来实现,总觉得不是 ...
- android设备外接键盘实现监听事件
需求分析 产品为一款基于android的交互终端,现在已经在android嵌入式系统上运行了一个第三方的交易软件(没有源码).在产品量产投入使用时,可以实现以下两点需求: 设备开机时自动启动交易App ...
- Android实现双击事件的监听
本文转自:Android实现双击事件的监听 Android实现view的双击事件监听,一般使用的场景,列表双击顶部回到第一条! 双击监听 /*** view双击监听事件*/ public class ...
- android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键
本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){ ...
- android 窗口监听按键,Android编程实现Dialog窗体监听的方法
本文实例讲述了Android编程实现Dialog窗体监听的方法.分享给大家供大家参考,具体如下: 今天做了一个Dialong窗体监听包括窗体内的xml监听. 效果图: test.class代码 pac ...
- android 关机消息广播,Android开机、关机播音监听
Android开机.关机广播监听 一.开机广播的监听 1.在AndroidManifest.xml文件注册接收开机广播 2.在BroadcastReceiver里执行要做的事情 public clas ...
- Android USB摄像头插拔监听
Android USB摄像头插拔监听 一.简要介绍 二.使用广播监听USB摄像头插拔情况 1.注册监听USB设备插拔广播 2.判断UsbDevice是否是Camera设备 (重点) 二.通过UsbMa ...
- Android DownloadManager下载完成事件监听(系列4)
Android DownloadManager下载完成事件监听(系列4) 我在之前写了写一些关于Android DownloadManager 的文章: (系列1)<Android大数据. ...
- Android的Usb设备的监听(Dev)外设端口的判定以及耳机的插拔
最近在公司用到外设,需要判断接入的外设的VendorId和ProductId,然后给大家说一下自己的学习成果把 ,首先我门可以通过android.hardware.usb.action.USB_STA ...
最新文章
- 每次输出日志前需要判断日志的级别吗?
- windows怎么更改系统默认编码为utf-8?(避免编译从linux系统弄过来的c文件printf出现乱码问题)(beta版:使用unicode utf-8提供全球语言支持)
- python zipfile 模块下中文乱码 '╡┌╥╗╒┬_╒╨▒Ω╣½╕µ.docx'
- 【ZZ】字符编码笔记:ASCII,Unicode和UTF-8
- 在Ubuntu上安装RealPlayer的方法
- jQuery动态设置样式List item
- java字符串为空抛出异常_Java 判断字符串是否为空的四种方法,及效率比较。
- linux 下进程和线程指定CPU运行
- Storm集群安装Version1.0.1开启Kerberos
- linux操作系统巡检报告,linux服务器巡检报告
- 算法(Algorithms)第4版 练习 2.1.24
- 在shell中获取当前机器的ip地址
- 监控三个指标 并不代表你能监控Tuxedo
- JavaScript实现map
- Python的线程如何理解
- 浅议初中语文微写作(语文教师论文)
- Google地图切片TMS格式,本地使用
- 根据已经commit的数据,进行leader和peon之间的同步
- msvcp140.dll丢失的详细修复教程
- 复旦大学-陈果老师笔记
热门文章
- 【洛谷5251】[LnOI2019] 第二代图灵机(线段树+ODT)
- Android子线程中更新UI的4种方法
- Consumer设计-high/low Level Consumer
- 经典机器学习算法系列3-k近邻算法
- 怎样新建Oracle数据库
- [3]工欲善其事必先利其器-------UML常用的图(三)
- 《侠侣天下》资料片武魂大揭晓
- 利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆
- shell 脚本常用参数
- Expected a key while parsing a block mapping. assets: ^