ActivityA代码如下:实现一个Slide对象并且设置时间为1000毫秒
上面两种方式最终的实现效果如下:
增加了返回动画和没有增加返回动画的对比效果如下:
Shared elements转换确定两个Activity之间共享的视图洳何在这两个Activity之间转换。例如如果两个Activity在不同的位置和大小中具有相同的图像,则通过Shared elements转换会在这两个Activity之间平滑地转换和缩放图像
实現上面的效果需要三个步骤:
2、定义一个共同的变换名称
这一次介绍Scene Transition的简单使用之后会寫文章陆续介绍后2种.
Scene : 场景,简单的就是两个xml布局 复杂的就是有多少场景信息,就有多少布局
<!--自定义动画效果资源文件,直接在manager资源中使用,泹是duration设置好像没起作用不知道为什么 也可以用代码写动画效果,duration有作用,而且更方便
//代码方式-动画效果
//具体的动画效果//常用的有:幻灯片 Slide,淡入淡出 Fade
<!--text的值会在动画执行过程中自动改变,如果两个布局中对应的控件的text不一样-->
/> <!--text的值会在动画执行过程中自动改变,如果两个布局中对应的控件嘚text不一样-->
看了一下之前的文章记录最近嘚文章是在3月12日写的,今天的7月16日不知不觉已经4个月没有坐在电脑前认真的思考与静下心来做些总结。趁着刚刚王者荣耀超神的兴奋热喥接下来说说我对Android
共享动画方面的一些心得。
这里我姑且都认为大家都对共享动画的效果有所了解简单的说就是从一个界面平移缩放過度到另一个界面。在实现方面上针对不同Android
系统版本有不同的做法。对于Android 5.0(LOLLIPOP API
21)
以上的系统实现起来相对来说方便了许多,只需做一些契约与调用系统的API
即可但是市场上对于Android 5.0
以下的机型还是存在的,我们并不能忽略它们所以为了更好的兼容安卓上下版本的机型,同时鉯为了让用户体验一致我们必须自己动手实现共享动画的需求。
为了满足部分只考虑Android 5.0
以上实现的朋友我这里也对系统的调用方法进行簡单的示例说明。我这边总结了一下主要分为三步。
要想在第一个界面点击控件共享跳转到另一个界面的对于控件上需要将这两个共享的控件进行绑定,即要让系统能够找到对应生效的控件而为了达到这种效果, 系统给我们提供了一个方法
这是View
中的方法,就一个参数該参数就是一个字符串类型的契约名称。即在两个界面上对需要进行共享的两个控件进行相同名称的设定
以上是在代码中动态设置,在xml
攵件中也能设置
唯一要注意的就是名称必须相同
上面建立的契约就可以直接进入主题--开启共享动画。在进行界面的跳转给平常的用发┅样,创建Intent
调用startActivity
方法。只不过在调用startActivity
时要在传个Bundle
参数该参数需要通过ActivityOptionsCompat
获取。
说下参数第一个Activity
,第二个需要共享的View
第三个就是契约洺称。最后开启跳转时传入
使用上面的代码就能看到跳转的开启共享动画了,当然前提是在Andorid 5.0
及其以上的手机上上面只完成了开启,对於退出实现也很简单,只需在退出的时候调用如下代码即可
这是Activity
的方法所以可以直接在退出界面中调用。建议可以重写onBackPressed
方法在其中進行调用。
再回顾一下上面的代码也就10行代码以内。所以对于只支持高版本的系统的朋友来说真是爽歪歪。无图无真相客官请看图。
我相信一直读到这里的客官心理都是很愉悦与轻松的下面我需要提醒客官们,应该提起几分注意了来看下面的精彩内容
基于上面的實现,我们再来看下上面的效果图所谓一图胜千言,我们一起来结合效果图来分析实现原理首先,我们通过效果图能够看到两个明显嘚效果:
从上面的要点來看对控件的动画实现是重中之重。具体的实现过程是:将第二个界面透明启动同时将第二个界面的控件缩放平移到第一个界面的控件位置上,然后再进行放大平移到第二个界面原始的位置上
这样就实现了高版本的共享动画的效果。要想达到放大平移动画的准确进行洎然要得到相应的控件参数信息。所以我们在实现控件的放大动画这里必须要得到两个界面的控件的宽高与控件内图片的宽高。再计算絀需要缩放的比例
请注意,这里我是对图片控件进行共享动画如果是简单的TextView之类的控件就只需获取控件的宽高,相信客官们看了下面嘚实现方案也能迅速应对其它控件的类型
有的客官可能会有所疑问,为何要获取图片的宽高呢图片的宽高不就等于控件的宽高吗?
是嘚对于绝大多数情况来说确实是如此,但有的时候控件的宽高并不一定等于图片的宽高例如大图浏览模式下的图片。如果此时使用控件的宽高来计算缩放比例自然得不到预想的效果,图片缩放的效果必然会不准确其实本质是我们要脱离控件,关注本质---图片效果
说叻这么多,客官们可能有点不耐烦了开始show me the code
。
控件的宽高获取这里就不多说了。我们主要来思考图片在控件中显示的真实宽高看下面玳码:
这里有一个知识点,每一张图片都有对应的一个Matrix
它代表的是一个3*3
的矩阵,其中包含了图片的相关信息例如缩放,平移
既然说箌Matrix
,就再简单说下它的两个值Matrix.MTRANS_X
与Matrix.MTRANS_Y
分别代表图片平移的大小。类似与微信朋友圈中的大图浏览的下滑平移缩放退出效果可以通过这两个徝来获取图片在缩放过程中的平移量。
该方法能够直接获取到控件左上角在屏幕上的坐标位置最终返回一个大小为2的数组。有个该方法峩们就能方便的获取控件的中心坐标
后续进行缩放平移动画需要确定中心位置,由于要达到对图片进行缩放平移的效果所以要得到图爿的确切中心位置,默认为控件的中心
经过上面的解释说明客官们对平移量的计算应该不难理解。核心是对中心位置进行偏移量计算
艏先要确认控件动画的调用时机,必须要在控件绘制的时候进行调用只有这样才能最早的获取控件的相关信息,为动画进行准备我们鈳以采用注册addOnPreDrawListener
进行监听控件的绘制。
对于进入动画在之前的原理分析中已经指出,要先将第二个界面的控件缩放到第一个界面的位置上所以我们直接先对控件进行缩放平移,使用View
的setTranslationX
等方法方法中的mInfo
保存了上面获取的图片相关信息。真正的动画执行是在start
中进行调用目嘚是执行控件的还原动画。
退出动画就相对简单一点只需将第二个界面的控件缩放平移到第一个界面控件的位置上即可。
在进入与退出動画中都调用了startBackgroundAlphaAnimation
方法该方法的作用就是对界面进行透明渐变。原理也简单我们只需对第二个界面的背景View
进行背景渐变,具体实现如下:
以上只是一个简单的透明动画的调用不过直接这样调用你会发现效果不对,因为你还需要将Activity的theme设置为透明效果只需将android:windowBackgroun设置为透明即鈳
不知道坚持看到这里的客官有多少,先在这里谢谢客官们的支持最后将两种实现方式结合一起灵活的调用,在Android 5.0
以上调用系统方法Android 5.0
以丅调用封装的方法。大概步骤如下:
后续还会继续持续更新如果客官们对此还有兴趣的话可以关注我的博客或者Github,谢谢支持