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

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
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:XDelta="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>时可应用XDelta="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动画相干的一些内容。

转自:http://www.mysjtu.com/page/M0/S912/912972.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值