本系列文章将以 MTK 6589 平台的 Gallery2 来讲解,其他平台 都类似,大家可以加以引用。。。(以后将不再做说明,谢谢!)
1.Gallery2整体架构
如图所示: java文件主要有 src、ext、gallerycommon、src_pd 四部分,
共计 440个文件。
Gallery2主要功能是实现本地存储器、MTP存储器和网络存储器中媒体(图像和视频)的浏览、显示和更多操作(删除、分享、选择和缩放等)。下面用一张简单的图描述了Gallery2的功能和职责。
2. Gallery2 各模块分析
2.1 数据处理(数据管理)
Gallery2的数据管理 DataManager(管理数据源)- MediaSource(管理数据集) - MediaSet(管理数据项)。DataManager中初始化所有的数据源(LocalSource, PicasaSource, MtpSource, ComboSource,ClusterSource, FilterSource, UriSource, SnailSource),将数据源放到一个Hash表中,提供存取操作。MediaSource负责管理数据集,以LoacalSource为例,从他的createMediaObject函数可以看出,根据路径他可以创建出LocalMediaSet, LocalMedia, LocalImage,LocalVideo等。
MediaSet负责管理数据项MediaItem。
图库数据管理简要图
2.2 图片显示
2.2.1 Gallery2主要的界面:
AlbumSetPage.java(相册缩略图);
AlbumPage.java(单个相册照片缩略图);
PhotoPage.java(单张照片);
SlideShowPage.java(幻灯片界面);
这些界面类父类为ActivityState.java;这些界面的切换由StateManager.java负责。
2.2.2 界面与数据源
Gallery2中主要的数据源有ComboSource.java(组合源); MtpSource.java(Mtp源); PicasaSource.java(Picasa源); LocalSource.java(本地源); ClusterSource.java(簇源); UriSource.java(URL源);FilterSource.java(过滤源)。数据源的共同基类为:MediaSource。数据源由 DataManager.java负责管理。界面类就是从DataManager中取一个合适的数据源初始化自己。另外数据源是由MediaObject 聚合而成,MediaObject也有多种形态。
数据渲染的最小单元为MediaOject,它包括丰富的衍生类(后续研究 OpenGL渲染的时候再详细分析)。
2.3图片操作
Gallery2的图片操作主要包括:
分享、播放幻灯片、幻灯片音乐、编辑、旋转、修剪、设置为、删除。。。
2.3.1 编辑:
图片编辑功能是google在原picasa基础上做的一个类似于photoshop的相关图片处理功能,相关的代码主要在:
com.android.gallery3d.photoeditor
com.android.gallery3d.photoeditor.actions
com.android.gallery3d.photoeditor.filters 包里。
该图片编辑功能主要的操作是对 图片的数据进行相应的渲染以达到相应的效果。具体实现在后续 讨论 OpenGL数据渲染的时候再举例说明吧。
2.3.2 播放幻灯片
界面与数据源:SlideshowPage ----SlideshowDataAdapter
2.3.2.1 SlideshowPage 的基本流程:
initializeViews()的流程如下:
initializeData() 流程如下:
下面来看一下 深入分析一下initializeData():
在前面可以看到由 data 可以取到幻灯片的是否随机播放以及path,
下面是取mediaset (mediaobject):
public MediaSet getMediaSet(String s) {
return (MediaSet) getMediaObject(s);
}
public MediaObject getMediaObject(String s) {
return getMediaObject(Path.fromString(s));
}
mModel = newSlideshowDataAdapter(mActivity,newSequentialSource(mediaSet, repeat),
index, path);
SequentialSource 实现了接口SlideshowDataAdapter.SlideshowSource ,
SlideshowDataAdapter 实现了 接口SlideshowPage.Model,
来看一下 mModel.resume()的具体实现:
public synchronized void resume() {
mIsActive = true;
mSource.addContentListener(mSourceListener); // mediaSet增加监听器
mNeedReload.set(true);
mDataReady = true;
mReloadTask = mThreadPool.submit(newReloadTask()); //加载图片
}
public voidaddContentListener(ContentListener listener) {
mMediaSet.addContentListener(listener);
}
private WeakHashMap<ContentListener, Object> mListeners =
new WeakHashMap<ContentListener,Object>();
// NOTE: TheMediaSet only keeps a weak reference to the listener. The listener isautomatically removed when there is no other reference to the listener.
public void addContentListener(ContentListener listener) {
if (mListeners.containsKey(listener)) {
throw newIllegalArgumentException();
}
mListeners.put(listener, null);
}
public interface ContentListener{
public void onContentDirty();
}
private class SourceListener implementsContentListener {
public void onContentDirty() {
synchronized(SlideshowDataAdapter.this) {
mNeedReload.set(true);
mDataReady = true;
SlideshowDataAdapter.this.notifyAll();
}
}
}
来看一下 showPendingBitmap() 和loadNextBitmap() :
由于能力有限,Gallery2结构分析 (图片显示、数据处理、图片操作 等等)部分暂时分析道这里,如果不足之处请多多指教,谢谢!
1. Gallery2结构分析 (图片显示、数据处理、图片操作 等等)
2. 重要的数据结构/数据成员分析 (MediaObject、MediaSet、Path 等等)
3. 重要的类介绍 (DataManager 、StateManager 、 ImageOptions 、 BitmapUtils 、AlbumSetPage、 AlbumPage 、PhotoPage 、CropImage 、 ManageCachePage 、 BitmapPool 、 UploadedTexture 等等
4. Gallery2界面切换 (数据加载、界面显示、堆栈管理 等)
5. opengl绘制流程 (数据渲染、纹理上传等)
6. Gallery2 代码优化探讨