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. eclipse中 报出The type javax.servlet.http.HttpServlet cannot be resolved. It is indirect错误
  2. SQLServer : 几个特殊函数(RAND,CHECKSUM, NEWID)
  3. Android——BaseAdapter相关
  4. LOVE代码收集
  5. POJ_1742_Coins_(动态规划,多重部分和)
  6. linux 下文件的比较
  7. Gradient Descent 和 Stochastic Gradient Descent(随机梯度下降法)
  8. winform 拖动无边框窗体(调用Windows API)
  9. 中国市场 Android App 兼容性报告
  10. exit()与_exit()的区别(转)
  11. P1045 麦森数
  12. thinkphp3.2-更改控制器名后找不到相应的表?报1146的错
  13. 好程序员分享ApacheSpark常见的三大误解
  14. [LeetCode] Binary Tree Pruning 二叉树修剪
  15. hosts文件被修改后的惨案
  16. Spring Boot 1.X和2.X优雅重启实战
  17. iOS UI布局-回到顶部
  18. C++前置声明
  19. ./configure: error: C compiler cc is not found
  20. 学习笔记之Sublime Text

热门文章

  1. 关于python的拷贝
  2. Python中的Sets数据结构
  3. 5、qq物联开发步骤
  4. c#.net公共帮助类
  5. ldd 查看程序/动态库 的依赖
  6. SDK应该包括什么东西
  7. vue学习笔记一:用Key管理可复用元素
  8. [Node.js] Testing ES6 Promises in Node.js using Mocha and Chai
  9. Android多线程研究(1)——线程基础及源码剖析
  10. Android 开发--CMakeList调用本地so文件