gallery2

来源:互联网 发布:ipad和手机同时上淘宝 编辑:程序博客网 时间:2024/05/17 09:07

1 数据管理:

DataManager(管理数据源)- MediaSource(管理数据集) - MediaSet(管理数据项) -MediaObject(管理单个图片) 。

DataManager中初始化所有的数据源(LocalSource, PicasaSource, MtpSource, ComboSource,ClusterSource, FilterSource, UriSource, SnailSource),将数据源放到一个Hash表中,提供存取操作。 这些数据源都是继承自:MediaSource

1  MediaSource

     本身不是一个数据集只负责管理数据集,以LoacalSource为例,从他的createMediaObject函数可以看出,根据路径他可以创建出LocalAlbumSet,LocalAlbum, LocalImage,LocalVideo等。

    其中LocalAlbumSet,LocalAlbum 继承自:MediaSet 负责管理数据项的。而LocalImage继承自 LocalMediaItem 最终继承MediaObject   是负责管理单个数据的。即单个image 或video。

    MediaSet负责管理数据项MediaItem以及其他MediaObject。这里的 MediaSetMediaObject 就像是  layout和view的关系一样,里面可以有许多个view但本身也是一个view

    下面看下 几个重要的数据层次上几个类的作用:

    MediaObject 主要负责判断是否支持 剪切,放大,全屏显示,删除等操作以及相应的操作的声明

    MediaItem 在MediaObject基础上 增加了获取图片的名字,模式,旋转角度,大小等信息。

    MediaSet  可以包含 MediaItem也可以包含 MediaSet 除了管理 数据集应有的获取 包含的个数 等加入了 同步加载数据相关的处理操作。

    MediaSource  这个类除了负责 对数据集合的管理外,最主要的功能是 控制数据的流程  在显示, 隐藏的时候会对数据进行相应的处理。

    这个里面相较 MediaSet 增加了 添加数据项的功能。

    另外还有一个数据集是负责管理 所有数据集的。DataManager

     DataManager 会一开始对所有的数据集进行初始化,并对数据进行同意操作

    到这里整个数据就结束了

2 接下来看下流程   

DataManager .initializeSourceMap()   ----addSource(new LocalSource(mApplication));---应用开始的时候 调用回调方法 resume() --- source.resume();下面

进入了 LocalSource的  resume();回调里面。这时开始初始化 数据库数据,得到ContentProviderClient 数据查询的句柄。这时数据就准备好了,接下来就等待

数据的显示以及其他更多操作了。

再来看下 数据显示 : 也是这里: 加载进相应的MediaSet,并显示,使用他们的回调方法进行各自的操作。结束。很简单,简单的前提是设计。没有这么好的设计

怎么能这么简单就就操作出来了呢。如果想看到一个从开始到结束的完整流程,需要结合界面显示来分析。



gallery2 的界面显示类主要有以下几个:

    AlbumSetPage.java(相册缩略图);

    AlbumPage.java(单个相册照片缩略图);

    PhotoPage.java(单张照片);

    SlideShowPage.java(幻灯片界面);

这些界面类父类为ActivityState.java;这些界面的切换由StateManager.java负责。

这些 ActivityState  可以 类比 fragment  相应的    activity 内部类 FragmentManagerImpl 类比 StateManager

接下来就来跟以下:

Gallery.java ---oncreate() ---- startDefaultPage() ----getStateManager().startState(AlbumSetPage.class, data);

这样的话就会调到 AlbumSetPage 这个类比较普通,我们找个特殊点的,这样可以跟到更多内容:

SlideShowPage 这个是个幻灯片界面。而且在和camera交互的时候就是这个类负责显示camera里面的内容。

SlideshowView.oncreate() -----initializeViews();-----mRootPane.addComponent(mSlideshowView);
        setContentPane(mRootPane); 这写方法,可以类比 activity里面 iew的初始化: layout.addview()    setcontentview(layout);

        在来看一条流程: oncreate()----- initializeData(data);   -----  mediaSet = mActivity.getDataManager().getMediaSet(mediaPath,
                                       mDrmInclusion);

mModel = new SlideshowDataAdapter(mActivity, new SequentialSource(mediaSet, repeat),
                    index, path);

数据传进来 对SlideshowDataAdapter进行初始化。SlideshowDataAdapter就是对这些数据进行操作的类。这样的话以后对数据的操作转化为对 SlideshowDataAdapter的操作

在具体的就不分析了,


这样的话就开始 DataManager 初始化自己然后开始显示 相应的mediaset 显示给用户。

       

下面来详细看下 view的绘制过程。

基本流程: GLview ----GLRootview----AlbumSetPage 这样一个调用过程。

AlbumSetPage.setContentPane-----mActivity.getGLRoot().setContentPane(mContentPane);

即是:GLRootView.setContentPane(mContentPane);---------mContentView.render(mCanvas);

mContentView实在AlbumSetPage里面实现的:GLView mRootPane = new GLView()

掉用suerper().render()。这个方法就相当于view.draw() 了。结了


0 0
原创粉丝点击