您的位置:首页 > 移动开发 > Android开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: