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

更多相关文章

  1. Android数据存储之SQLite
  2. Android开发学习之路--Content Provider之初体验
  3. Android(安卓)Service 通知Activity更新界面的方法
  4. Android简易的仿微信聊天的语音播放控件
  5. 记Android(安卓)版本 和 市场占有率
  6. 较深入的分析Content Providers用法
  7. android 7种对话框的使用
  8. Android(安卓)M系统启动流程
  9. Android之自定义View的死亡三部曲之(Layout)

随机推荐

  1. Android通过zxing来进行二维码识别与生成
  2. Android Fragment 生命周期onCreatView、
  3. Android帧缓冲区(Frame Buffer)硬件抽象层(H
  4. android gradle 3.0.0 中依赖指令impleme
  5. Android开发指南 —— Multimedia and Ca
  6. Android的Task和Activity(二)
  7. 如何在EditText中设置固定图片——Androi
  8. 关于修改Android系统默认语言
  9. Android(安卓)SparseArray的用法
  10. Android使double保留两位小数的多方法 ja