模仿即刻点击图片的效果

zoom_mulit_view.gif
zoom_single_view.gif

github地址:ZoomView

想要使用当前动画需要对Theme进行设置
true

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类,其中关键的两个元素transitionViewtransitionName 将前后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 并且增加了一个Index,为了选择url和设置viewPager

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);

你可能感兴趣的:(模仿即刻点击图片的效果)