生命不息,奋斗不止
前言
看了一下之前的文章记录,最近的文章是在3月12日写的,今天的7月16日。不知不觉已经4个月没有坐在电脑前认真的思考与静下心来做些总结。趁着刚刚王者荣耀超神的兴奋热度,接下来说说我对Android
共享动画方面的一些心得。
实现方案
这里我姑且都认为大家都对共享动画的效果有所了解,简单的说就是从一个界面平移缩放过度到另一个界面。在实现方面上针对不同Android
系统版本,有不同的做法。对于Android 5.0(LOLLIPOP API 21)
以上的系统,实现起来相对来说方便了许多,只需做一些契约与调用系统的API
即可。但是市场上对于Android 5.0
以下的机型还是存在的,我们并不能忽略它们,所以为了更好的兼容上下版本的机型,同时以为了让用户体验一致,我们必须自己动手实现共享动画的需求。
Android 5.0 及其以上的实现
为了满足部分只考虑Android 5.0
以上实现的朋友,我这里也对系统的调用方法进行简单的示例说明。我这边总结了一下,主要分为三步。
建立契约
要想在第一个界面点击控件共享跳转到另一个界面的对于控件上,需要将这两个共享的控件进行绑定,即要让系统能够找到对应生效的控件。而为了达到这种效果, 系统给我们提供了一个方法
public final void setTransitionName(String transitionName)
这是View
中的方法,就一个参数,该参数就是一个字符串类型的契约名称。即在两个界面上对需要进行共享的两个控件进行相同名称的设定。
public static final String TRANSITION_NAME_SHARE = "share";
imageView.setTransitionName(TRANSITION_NAME_SHARE);
以上是在代码中动态设置,在xml
文件中也能设置
android:transitionName="share"
唯一要注意的就是名称必须相同
调用ActivityOptionsCompat
上面建立的契约,就可以直接进入主题–开启共享动画。在进行界面的跳转,给平常的用发一样,创建Intent
,调用startActivity
方法。只不过在调用startActivity
时要在传个Bundle
参数。该参数需要通过ActivityOptionsCompat
获取。
ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, imageView, TRANSITION_NAME_SHARE);
说下参数,第一个Activity
,第二个需要共享的View
,第三个就是契约名称。最后开启跳转时传入。
startActivity(intent, compat.toBundle());
finishAfterTransition
使用上面的代码就能看到跳转的开启共享动画了,当然前提是在Andorid 5.0
及其以上的手机上。上面只完成了开启,对于退出,实现也很简单,只需在退出的时候调用如下代码即可
finishAfterTransition();
这是Activity
的方法。所以可以直接在退出界面中调用。建议可以重写onBackPressed
方法,在其中进行调用。
再回顾一下上面的代码,也就10行代码以内。所以对于只支持高版本的系统的朋友来说,真是爽歪歪。无图无真相,客官请看图。
兼容全版本实现
我相信一直读到这里的客官心理都是很愉悦与轻松的,下面我需要提醒客官们,应该提起几分注意了来看下面的精彩内容。
原理
基于上面的实现,我们再来看下上面的效果图,所谓一图胜千言,我们一起来结合效果图来分析实现原理。首先,我们通过效果图能够看到两个明显的效果:
- 界面背景是透明渐变的方式过度到另一个界面的。
- 控件是从第一个界面原地放大平移到第二个界面的控件位置上。
从上面的要点来看,对控件的动画实现是重中之重。具体的实现过程是:将第二个界面透明启动,同时将第二个界面的控件缩放平移到第一个界面的控件位置上,然后再进行放大平移到第二个界面原始的位置上。
这样就实现了高版本的共享动画的效果。要想达到放大平移动画的准确进行,自然要得到相应的控件参数信息。所以我们在实现控件的放大动画,这里必须要得到两个界面的控件的宽高与控件内图片的宽高。再计算出需要缩放的比例。
请注意,这里我是对图片控件进行共享动画,如果是简单的TextView之类的控件就只需获取控件的宽高,相信客官们看了下面的实现方案也能迅速应对其它控件的类型。
有的客官可能会有所疑问,为何要获取图片的宽高呢,图片的宽高不就等于控件的宽高吗?
是的