Android Transition

1.ActivityOptions

在Android2.0之前要实现Activity之间的过渡动画,使用的是overridePendingTransition。google在Android5.0提出了MD的设计风格,并扩充了Activity的转场动画,利用ActivityOptions和ActivityOptionsCompat可以实现新风格的转场动画。ActivityOptionsCompat是ActivityOptions的兼容包,虽然是兼容包但内部有的动画风格在5.0以下的版本依然不支持,只不过坚持在低版本使用ActivityOptionsCompat的动画不会出现crash。

ActivityOptionsCompat的主要作用是生成startActivity( Intent, Bundle) 所需要的Bundle,再配合其他方法实现转场动画。

ActivityOptionsCompat是一个静态类,提供了几个方法:

①ActivityOptionsCompat.makeCustomAnimation(Context context, int enterResId, int exitResId)

用户自定义动画,指定进入和退出动画。

enterResId:Activity进入动画资源id

exitResId:Activity退出动画资源id

比如,Activity1启动Activity2:

ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(this,R.anim.translate_in, R.anim.translate_none);

ActivityCompat.startActivity(this, new Intent(this, Activity2.class), compat.toBundle());

在Activity2退出的时候调用ActivityCompat.finishAfterTransition(this)进行退出动画。

②ActivityOptionsCompat.makeScaleUpAnimation(View source,int startX, int startY, int startWidth, int startHeight)

放大一个view,然后显示新的activity,效果就是不断的放大一个view,进而进行activity的过度。

source:放大的view

startX,startY:从哪里开始缩放,以source为原点

width,height:新的activity从多大开始放大,如果是0,0则表示从最小开始。

ActivityOptions options = ActivityOptions.makeScaleUpAnimation(

 view, 0, 0, //拉伸开始的坐标

 view.getMeasuredWidth(), view.getMeasuredHeight()); // 初始的宽高

startActivity(intent, options.toBundle());

 

c7ee527b589e4fc1a54880156346f509.gif

 ③ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source,Bitmap thumbnail, int startX, int startY)

放大一张图片,然后打开activity

source:参考原点

thumbnail:要放大的图片

startX,startY:从哪里开始放大,以source为坐标原点

Bitmap bitmap = view.getDrawingCache();

ActivityOptions options = ActivityOptions.makeThumbnailScaleUpAnimation(view, bitmap, 0, 0);

startActivity(intent, options.toBundle());

bcfa8b44c8014cdf96f7699210f56011.gif

 ④ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)

两个activity中的某些view协同完成过渡动画,即共享元素过渡动画。

⑤ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity,Pair<View, String>… sharedElements)

多个共享元素过渡动画。。

Pair<View, String> imagePair = Pair.create(mImageView,"share1");

Pair<View, String> textPair = Pair.create(mTextView,"share2");

ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation(this, imagePair, textPair);

ActivityCompat.startActivity(this, new Intent(this, Activity2.class),compat.toBundle());

ActivityOptionsCompat提供了这5种过渡方式,使用时需要在theme指定:

<item name="android:windowContentTransitions">true 

</item>

除了第一个指定了动画外,其他的好像没有机会去指定动画,如果想换一种动画呢?android提供了几种预设的动画方式,它们分别是change_bounds、change_clip_bounds、change_transition、change_image_transition、change_scroll。

首先需要在res目录下新建一个目录transition,然后在transition目录里新建xml文件,如果是change_bounds,则代码这么写:

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

    <changeBounds />

</transitionSet>

如果是change_clip_bounds,则代码这么写:

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

    <changeClipBounds />

</transitionSet>

其他的类似,那怎么指定使用这些xml呢?还需要在styles.xml文件中配置theme:

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light">

        <item name="android:windowContentTransitions">true</item>

       //指定进入和退出的动画可以重叠

        <item name="android:windowAllowEnterTransitionOverlap">true</item>

        <item name="android:windowAllowReturnTransitionOverlap">true</item>

        //指定普通进入和退出的transition,这里使用了android预设的两个transition

        <item name="android:windowEnterTransition">@android:transition/slide_bottom</item>

        <item name="android:windowExitTransition">@android:transition/slide_bottom</item>

        //指定使用sharedElement时的进入和退出动画,这里使用了自定义的transition

        <item name="android:windowSharedElementEnterTransition">@transition/change_bounds</item>

        <item name="android:windowSharedElementExitTransition">@transition/change_bounds</item>

    </style>

</resources>

除此之外,还可以指定transition动画的速度插值器和动画时长:

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

    <changeBounds

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

        android:duration="500"/>

</transitionSet>

 

2.Transition

Transition的意思是过渡,这里指过渡动画。

Transition内部使用了属性动画来实现,所以它可以认为是属性动画的封装。Transition有两个核心概念为:场景(scenes)和变换(transitions),场景是UI当前状态,变换则定义了在不同场景之间动画变化的过程。所以Transition主要负责两个方面,一是保存开始和结束场景的两种状态,二是在两种状态之间创建动画。由于场景记录了内部所有View的开始和结束状态,所以Transition动画更具连贯性。而TransitionManager负责执行动画的任务。

使用Transition需要注意:

①使用Transition的activity需要启用transition ,有两种方法:

1)通过代码启用

在setContentView之前调用:

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

2)通过设置主题xml方式启用

<item name="android:windowContentTransitions">t

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值