Fragment是Android在API 11以后加入的一个组件,对提升Android开发中的布局合理性和布局效率都有很大做用,尤为是在Android平板等大屏幕设备的开发中,Fragment的引入能更好地利用较大的屏幕空间。android
本文主要说明Fragment使用简介、Fragment自定义动画的使用、监听动画过程、以及在较低API版本中使用兼容性包来实现上述功能。app
首先简要说一下添加Fragment方法,能够直接在Activity的布局文件中加入fragment标签ide
<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()等不一样的操做。spa
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等方法以前被调用。code
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
<?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>貌似没找到这种相对的定义方法,有高手知道还请赐教~blog
至于为何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动画相关的一些内容。