Gallery4.2 代码研究(一):Gallery2结构分析

本系列文章将以 MTK 6589 平台的 Gallery2 来讲解,其他平台 都类似,大家可以加以引用。。。(以后将不再做说明,谢谢!)


1.Gallery2整体架构

如图所示: java文件主要有 src、ext、gallerycommon、src_pd 四部分,

   001  

共计 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 代码优化探讨



 


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值