Android5.0 SharedElement的使用
2015-11-05 22:47
513 查看
概述
SharedElement是什么,翻译是共享元素,但是光说也说不出个杰宝来,no picture say a jb,先看一下效果图,省好多话。这个效果目前只支持API21以上,之前的可以使用一些兼容库,比如这个ActivityOptionsICS。废话少说,下面来介绍一下如何去使用和实现这个效果。
简单原理
俗话说眼见为实,这句话也不一定对,从上面的图可以看到,从activityA的一个图片,变大进入到了activityB里面。好像是把A的图片传递给了B去显示。其实几乎所以的变换都是在B里面完成的,A并没有干什么卵事情。简单的说就是把A里面的图片的位置,大小等信息传递给B,然后B通过这些信息在自己的界面里面绘制出一模一样的,然后在通过比较最终的大小和位置等信息,创建出一个Animator,再然后就是动画的执行。这就看起来像是A里面的元素共享到了B里面。当然具体的过程远比这复杂的多。实现步骤
要使用共享元素,要先在调用和被调用的Activity里面声明,getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);,注意这句话要在
setContentView之前调用。也可以在主题里面声明
<item name="android:windowContentTransitions">true</item>
想要共享的元素要有相同的
TransitionName,可以在XML文件里面声明,或者在代码里面
setTransitionName()。这里使用了
RecyclerView要去设置
TransitionName就应该去
adapter里面设置。这里使用了
AppCompatActivity,所以可以
ViewCompat.setTransitionName(holder.imageView, image.getUrl());,当然也可以
holder.imageView.setTransitionName(image.getUrl());。这个要确保A,B里面要共享的元素拥有相同的
TransitionName,否则
framework将不知道怎么去变换。
然后就可以去
startActivity了,但是这里的
startActivity还需要一个
Bundle对象,用于传递共享元素的一些信息,例如:
4.
ActivityOptionsCompat options = ActivityOptionsCompat .makeSceneTransitionAnimation(this, view, mAdapter.get(position).getUrl()); startActivity(intent, options.toBundle());
5.其实现在就已经可以实现简单的共享元素的效果了,就是这么简单。但是上面的效果图可以看到,当切换到其他的图片的时候,依然可以正确的”共享”回来,这就不是简单是设置
TransitionName这么简单了。
完善效果
首先要先弄明白两个Activity的转换是分几种情况的:开始时从A进入B:
1.A退出(exit) ,A中的View播放动画
2.B进入(enter) ,B中的View播放动画
当从B退回A时:
1.B返回(return) ,B中的View播放动画
2.A重新进入(reenter) ,A中的View播放动画
其实当进入带ActivityB的时候,是应该调用
setEnterSharedElementCallback(SharedElementCallback),当使用简单的共享元素的时候,可以不写这句话,framwork已经帮我们实现好了。这里写这个是因为有时(滑动页面之后)要返回非进入的共享元素,要去回调过去。当然callback也是可以选择实现方法的,一般没有什么效果的只要实现onMapSharedElements就可以了。再来说一下常用的实现方法:
onMapSharedElements
装载共享元素
onSharedElementStart
是共享元素开始时候回调,一般是进入的时候使用
onSharedElementEnd
是共享元素结束的时候回调,一般是退出的时候使用
当然还有其他的方法,具体可以看看文档。
每次进入和退出都会回调SharedElementCallback,所以一般来说在
onSharedElementStart和
onSharedElementEnd里面要去判断是返回还是进入操作,当进入时,执行
onSharedElementStart,返回时调用
onSharedElementEnd。如何去判断是返回还是进入呢,可以在
finishAfterTransition方法中进行判断,当执行返回操作时,一般是back键时,判断是返回操作,然后去执行
onSharedElementEnd里面的方法,否则去执行
onSharedElementStart里面的方法。同时,要去返回一些共享元素的信息也可以在这里回调回去。比如这里的图片的position。
当返回到activityA的时候,要去获取activityB返回的信息,可以在
onActivityReenter(int requestCode, Intent data)方法里面获取,比如这里获取到返回的position信息,然后去把
RecyclerView滑动到响应的位置。同样的,activityA是要设置
setExitSharedElementCallback的。这样才能响应到返回的共享元素
当然,这么说还是很抽象的,有兴趣可以去看一下我的一个开源项目,GitHub地址,欢迎star和提意见。
这里还有一些学习共享元素的开源项目
activity-transitions
MaterialTransitions
Material-Animations
同时也欢迎访问我的个人博客 http://70kg.info
相关文章推荐
- 挨踢人的脚步(2015.11.05)
- Android SlidingMenu 使用详解
- 初识Android中的IPC
- No resource found that matches the given name 'android:Theme.Holo.Light'
- Android Studio中NDK开发
- android 6.0 Runtime Permissions Check
- Android tips
- Android基础入门教程——8.3.15 Paint API之——Typeface(字型)
- Android对话框
- 【Android开发—智能家居系列】(四):UDP通信发送指令
- Android事件拦截/分发/响应 机制
- 【Android开发—智能家居系列】(三):手机连接WIFI模块
- Android IOS WebRTC 音视频开发总结(五十)-- 技术服务如何定价?
- Android 布局样式和主题
- Android开发手记(22) 传感器的使用
- Android案例(1)——美女拼图小游戏
- android手势操作事件处理
- Android开发&send email
- Android第三方服务(1):语音识别(1)
- 必懂java、android知识