最近在做原生Gallery的UI修改和和功能改进工作,所以大约半个月的工作,终于对Gallery的主UI部分有了一定了解,对Gallery的整体结构有了一定认识。在修改的过程中遇到了各种各样的坑,好在UI修改部分的工作已经接近尾声,下一阶段主要是新功能的添加。
常言道:好记性不如烂笔头。所以将Gallery相关的内容做一次细致的梳理,相信这对同样做系统原生应用的同学也能有所帮助。
一、Gallery的UI结构
Gallery的相册,图片流,单张图片虽然看上去是不同的页面,但是都是在同一个Activity上绘制的,这个Activity就是Gallery的入口GalleryActivity。
相册对应AlbumSetPage,图片流对应AlbumPage、单张照片对应PhotoPage。
这三个Page的具体内容都继承自GLView,这个View继承自OpenGL。
也就是说,Gallery的主要界面是绘制的,那么修改UI的时候也主要是修改绘制UI的代码。
在AlbumPage中的注释给出了他们的关系:
// This are the transitions we want:
//
// +--------+ +------------+ +-------+ +----------+
// | Camera |---------->| Fullscreen |--->| Album |--->| AlbumSet |
// | View | thumbnail | Photo | up | Page | up | Page |
// +--------+ +------------+ +-------+ +----------+
// ^ | | ^ |
// | | | | | close
// +----------back--------+ +----back----+ +--back-> app
//
二、Gallery的page管理机制
Gallery在页面的实现没有使用android自己的Activity,而是使用了OpenGL。所以需要对Page进行管理。在这部分可以比较清晰的看到页面是如果被管理的,阅读这部分代码可以帮助理解Android的Activity管理机制。
Gallery引入了StateManager类对Page进行管理。
在这个类中,提供了诸如startState()方法、startStateForResult()方法等以及menu相关的方法,类似于Activity的startActivity()、startActivityForResult()方法。
三个Page都继承ActivityState类,这个类用于实现模拟了生命周期方法,和ActionBar的获取。
而真正的生命周期方法则由这个类中使用的AbstractGalleryActivity()提供,这是一个Activity的子类。
三、SlotVIew
SlotView是Gallery相册和照片流两个页面的显示内容的条目。
slotVIew由三个部分组成,显示缩略图的Content,显示文件夹名称、数目、文件夹icon的Label,以及由选择时的蓝色效果、相片文件夹上的相机icon组成的图层。
SlotVIew各个部分的大小、颜色、字体、padding、margin等都由Config.java来管理,
并通过AlbumSetSlotRenderer、AlbumSlotRenderer两个类中的renderSlot()方法进行渲染。
通过以上三个部分就把Gallery的UI统一起来了。
根据以上提及的类和方法可以相对轻松的理清GalleryUI的主要逻辑。
四、关于Gallery的一些想法
Gallery的代码自从android 2.*以来就没有什么太大的变化,除了将Gallery3d改成Gallery之外似乎就没什么了。正是由于Gallery年代久远,才保留了Gallery代码上接近系统代码得特征。
做这种系统应用的好处就是能对Android的一些机制由更好的理解,坏处也很明显,跟现在的主流APP开发流程脱节。
现在流行的MVP模式和它的几个实现库什么的做系统应用是接触不到的。在编程的过程中,领导一再要求避免使用第三方代码,因为要避免可能的法律风险。所以一切都是Android APP最原始的状态。
五、附
这里给出一个Gallery的MVC架构图:
图片来自:http://blog.csdn.net/weihan1314/article/details/38588821