github地址:ZoomView
想要使用当前动画需要对Theme进行设置
Gradle
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Step 2. Add the dependency
dependencies {
compile 'com.github.lvmaomao:ZoomView:0.0.7'
}
ZoomViewHepler
图片放大:放大动画,滑动关闭
ImageView
的放大利用的就是ActivityOptions
类,其中关键的两个元素transitionView
和transitionName
将前后Activity元素设置相同就可以进行放大和缩小的位移动画了。
使用方法
ViewerActivity
是图片展示的activity,需要在AndroidManifest.xml
中注册;
单个ImageView放大
TransitionSingleHelper
针对单个View的辅助类,首先在当前页面进行初始化
TransitionSingleHelper singleHelper;
singleHelper = new TransitionManager(OneActivity.this).getSingle();
跳转的时候直接执行startViewerActivity
,第三个参数是需要放大的图片资源,现在支持:File、Url、ResId
singleHelper.startViewerActivity(this, v, url);
多个ImageView放大
其实多个图片与单个图片主要的不同就是返回缩略图时候transitionView和transitionName的同步问题,返回之后我们需要更新一下,我还是将主要的代码贴出。
private TransitionMultiHelper multiHelper;
multiHelper = new TransitionManager(this).getMulti();
setExitSharedElementCallback(helper.sharedElementCallback);
重点的地方来了,我们需要复写Activity下的onActivityReenter()方法,当前方法下我们可以拿到放大页面中更改后的transitionView和transitionName;
@Override
public void onActivityReenter(int resultCode, Intent data) {
super.onActivityReenter(resultCode, data);
multiHelper.update(data, new TransitionMultiHelper.UpdateTransitionListener() {
@Override
public View updateView(int position) {
return ViewGroup.getImageView(position);
}
@Override
public String updateName(int position) {
return Urls.get(position);
}
});
}
最后就是打开新页面的方法也不同, 将url替换成了ArrayList
multiHelper.startViewerActivity(TwoActivity.this, view, (ArrayList) Urls, index);
补充
更新于10月13日
之前一直没有考虑到使用RecyclerView和Fragment下使用转场动画来实现图片放大的功能,现在补充一下:
Fragment下Imageview放大问题
1,Fragment没有想Activity更换共享元素的方法。尝试使用Activity内的setExitSharedElementCallback()方法去进行修改,但是发现callback并没有被回调。具体原因不是很清楚,所在使用Fragment作为缩略图页面。只能用父Activity持有Fragment的对象,在设置共享元素的时候让Fragment提供;(恶略的解决方案。只能解决简单的使用场景)
2,多层Fragment嵌套。如果还是用Activity持有的话代码入侵太严重,并且冗余的厉害,看下面的代码你害怕吗?
eg:MainActivity->ParentFragment->ViewPager->ChildFragmentA
->ChildFragmentB
->ChildFragmentC
...
RecyclerView下Imageview放大问题
正常情况下并没有问题,但是如果你需要展示的item比较多,并且在屏幕没无法展示的情况下就会遇到问题,由于缩略图页面和展示页面的元素相同才可以进行转场动画,这个时候,如果你去取reyclerView内item内的ImageView就会为null,recyclerView将不展示的item回收掉了。
所以暂时的解决方式是,在Fragment和RecyclerView内Item过多的情况下,建议只使用放大功能,不关注关闭后缩回。
具体可以看一下demo
更新于11月1日
调整了部分用法
//设置当前helper是否有动画
helper.setAnim_type(TransitionConstant.Type.TYPE_HAVE_ANIM);
helper.setAnim_type(TransitionConstant.Type.TYPE_HAVE_NOT_ANIM);
//传递的类型并不局限与String 还可以传递 File 和 int
startViewerActivity(v, R.mipmap.ic_launcher);