修改fragment的进入动画_Android中ObjectAnimator为Activity、Fragment设置过渡动画效果的方法...

在iOS应用开发过程中,视图切换时的过渡动画是一个不可缺少的部分,简单的在Storyboard中托几个VC后连接上segue就可以实现,并可以选择几种如push,popover之类的动画效果,复杂的可以通过编码实现自定义的酷炫过渡动画效果(Github上有许多开源项目可以参考)。

最近一直在参研Android L的UI新特性,看到了更多注重UX的设计理解(当然也包括许多酷炫的效果,如OverScroll的新EdgeEffect、大部分控件的触摸效果,Reveal Effect等),其实从4.0 ICS开始,Android UI部分就有了很大的改进,当然也包括本篇要记录的过渡动画效果。4.0之前的UI动画主要是以Animation框架实现的,而4.0后加入了新的ObjectAnimator框架(貌似是3.0就有了,不过3.x是在没有存在感…),可以提供更多的动画控制从而实现更多的动画效果,这里记录下ObjectAnimator XML动画资源用于Activity和Fragment切换过渡动画的基本方法。

ObjectAnimator是以对一系列可变属性,如位移、旋转、缩放、Alpha等的改变来实现动画效果的,既可以使用写代码也可以使用定义XML资源文件的方式完成,这里以XML资源为例,在Android项目中存放于res/

card_flip_left_in.xml:

android:valueFrom="1.0"

android:valueTo="0.0"

android:propertyName="alpha"

android:duration="0" />

android:valueFrom="-180"

android:valueTo="0"

android:propertyName="rotationY"

android:interpolator="@android:interpolator/accelerate_decelerate"

android:duration="@android:integer/config_longAnimTime" />

android:valueFrom="0.0"

android:valueTo="1.0"

android:propertyName="alpha"

android:startOffset="@android:integer/config_mediumAnimTime"

android:duration="1" />

card_flip_left_out.xml:

android:valueFrom="0"

android:valueTo="180"

android:propertyName="rotationY"

android:interpolator="@android:interpolator/accelerate_decelerate"

android:duration="@android:integer/config_longAnimTime" />

android:valueFrom="1.0"

android:valueTo="0.0"

android:propertyName="alpha"

android:startOffset="@android:integer/config_mediumAnimTime"

android:duration="1" />

card_flip_right_in.xml:

android:valueFrom="1.0"

android:valueTo="0.0"

android:propertyName="alpha"

android:duration="0" />

android:valueFrom="180"

android:valueTo="0"

android:propertyName="rotationY"

android:interpolator="@android:interpolator/accelerate_decelerate"

android:duration="@android:integer/config_longAnimTime" />

android:valueFrom="0.0"

android:valueTo="1.0"

android:propertyName="alpha"

android:startOffset="@android:integer/config_mediumAnimTime"

android:duration="1" />

card_flip_right_out.xml:

android:valueFrom="0"

android:valueTo="-180"

android:propertyName="rotationY"

android:interpolator="@android:interpolator/accelerate_decelerate"

android:duration="@android:integer/config_longAnimTime" />

android:valueFrom="1.0"

android:valueTo="0.0"

android:propertyName="alpha"

android:startOffset="@android:integer/config_mediumAnimTime"

android:duration="1" />

slide_down.xml:

xmlns:android="http://schemas.android.com/apk/res/android"

android:interpolator="@android:anim/accelerate_decelerate_interpolator"

android:propertyName="translationY"

android:valueType="floatType"

android:valueFrom="0"

android:valueTo="1280"

android:duration="@android:integer/config_mediumAnimTime"/>

slide_up.xml:

xmlns:android="http://schemas.android.com/apk/res/android"

android:interpolator="@android:anim/accelerate_decelerate_interpolator"

android:propertyName="translationY"

android:valueType="floatType"

android:valueFrom="1280"

android:valueTo="0"

android:duration="@android:integer/config_mediumAnimTime"/>

有了

startActivityForResult(intent, 100); getActivity().overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

两个参数分别为enterAnim和exitAnim,进入、退出动画。

相对而言,Fragment的过渡动画设置方法看着就要专业一些了,对

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.setCustomAnimations(R.animator.card_flip_left_in,

R.animator.card_flip_left_out,

R.animator.card_flip_right_in,

R.animator.card_flip_right_out);

setCustomAnimations的声明是

public abstract FragmentTransaction setCustomAnimations

(int enter, int exit, int popEnter, int popExit)

也有只有前两个参数的版本,后两个pop版为通过回退栈(back stack)触发的正反向动画。

PS:顺带一提使用Fragment时的Back键pop回退fragment栈中的fragment问题,本来以为在进行过fragment进栈操作后,会自动处理back键pop到没有为止,结果发现就算

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.setCustomAnimations(R.animator.card_flip_left_in,

R.animator.card_flip_left_out,

R.animator.card_flip_right_in,

R.animator.card_flip_right_out);

Fragment frag = SettingsFragment.newInstance();

frag.setArguments(null);

ft.replace(R.id.container, frag);

ft.addToBackStack(null);

ft.commit();

这样addToBackStack后,当前Activity(我用的是ActionBarActivity)在响应back键时还是会执行默认的退出行为,而不是pop stack上的fragment先,这点可能在其它形式的fragment应用中,比如navigation drawer activity中会先pop吧,总之,这里我还是先通过override onBackPressed来处理了一下:

public void onBackPressed() {

// Pop fragment stack on back button

FragmentManager fm = getFragmentManager();

if (fm.getBackStackEntryCount()>0) {

fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

return;

}

super.onBackPressed();

}

这样就可以了。

文字加密小工具v3

请输入要加密的内容

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值