TransitionAnimation 的内存预加载(不知可否称预渲染),优化不同尺寸图片的顺滑穿越

Jul-02-2015-1421.gif

在做 妹纸.gank.io 的时候,我遇到了一个问题,当我使用 5.0 所带来的新 TransitionAnimation 特性的时候——这个特性简单说就是让两个页面相同的组件能够来回穿越,如 gif 图所示——我发现我点击主页的妹纸图,跳到查看妹纸原图的页面,会在妹纸原图的页面出现小问题,即有时妹纸图会卡在左上角没有扩展到整个屏幕大小。这个问题在5.0以下的系统尤其明显。

原因我想是因为两张妹纸图的尺寸其实是不一样的,在主页使用的是略缩图,而在 PictureActivity 使用的是原图,两张尺寸不一样,于是 load 图片的时候,需要重复去取缓存文件(或网络文件)再加载到内存当中,读取文件总是要一定时间,导致跳跃或卡在左上角的问题。

而且我发现当第二次点击的时候,就不会卡或跳跃,因为这张原图已经在第一次 load 的时候加载到内存中了,第二次就直接内存中取了,因而很顺滑完美。

发现了这两点以后,我很快想到一个优化方案,这个方案就是为了让第一次如第二次一般顺滑流畅。想到:只要原图在内存中已经存在,点击之后到原图页面就不会出问题,那么我只要让程序在点击的时候预先加载到内存,等加载好了,再进行回调 startActivity() 是不是就好了?应该没错,那么怎么才能预加载到内存呢?我想到了很久以前看到 Instagram 的一篇优化文章,讲得是 Instagram 对于 TextView 的预加载预渲染方案,便是在一块看不见的地方,进行预先加载渲染。——因此我很自然也是想到在看不见的地方放一个 ImageView 来作为预加载的载体,等加载完了,原图可能已经存在于内存中,这时候再 load 就顺滑了。

没想到这个想法实现起来一下子就奏效了,都没想到这么完美,便是如右上边的 gif 图所示,顺滑穿越~

看到这个小细节小问题被解决,真是特别开心,真的是写程序的乐趣不过如此,自我陶醉,哈哈!另外,说来也感慨,在看乔布斯的那次「Stay hungry. Stay foolish.」的演讲,我记得乔布斯分享过他的一个故事,说如果它没有在十年前学过字体的创造知识,也就不能够在十年后的 Mac 电脑上用上(实现、创造)那么漂亮的字体,不懂得考究。而我如果很久以前没有看到那篇 Instagram 的 TextView 优化,我估计也想不出现今这个很不错的解决方案。。。