通常我们在使用app的时候都会遇到这么一个场景,点开缩略图查看大图,而现在一般app都为这样的一个功能加上了过渡动画,不会让人觉得这个过程很突兀,体验就好了很多。但是,通常的,新的大图页面的图片加载往往需要时间,所以在实现这样的一个功能的时候,怎样让图片看起来像是没有被改变过并且真正显示在大图上面的是高清图,需要一点小技巧。

其实没有那么复杂,我们只需要对开启的新页面中的大图设置一个初始默认图,这张图片的来源即点击时的那一张缩略图,那么怎样获取这张做略图,相信大家一定有很多的方法,我现在采用的是ImageView.getDrawable()。拿到这个drawable对象之后,那么只需要把它设置到大图上去就好,怎么传值?好吧,其实我使用的是单例对象持有该drawable,在第二个页面开启时获取。这个时候就会遇到一个坑,每次第二个页面从onStop回复到onResume状态(比如页面跳转,或者点击Home键)时,此时关闭大图页面,原来的缩略图就不一样了,它只显示了一部分!

Why?原来是被单例持有的这个drawable它同时被两个ImageView绘制了,在第二次ImageView绘制的时候这张Drawable的bounds被改变了,所以当回到原来的缩略图页面时,控件和drawable的bounds不一样了,显示的效果也就变成了只显示一部分。

那么其实只需要复制一个一样内容的drawable给大图作为占位图就好了,Drawable本身也提供了这样一个方法:drawable.getConstantState().newDrawable() 这样我们就拿到一个同样内容不同对象的drawable了。