Android4.4 Gallery2图库浅析

代码路径:

    packages\apps\Gallery2。

 

一.Gallery2的用例图分析

    Gallery2主要功能是实现本地存储器、MTP存储器和网络存储器中媒体(图像和视频)的浏览、显示和更多操作(删除、分享、选择和缩放等)。下面用一张简单的用例图描述了Gallery2的功能和职责。

 

二.Gallery2的状态管理整体架构

    Gallery2中总共只有一个Activity,这个Activity就是Gallery。Gallery2是一个多窗口的程序,包含以下四个窗口。

  •  AlbumSetPage.java(相册缩略图);
  • AlbumPage.java(单个相册照片缩略图);
  • PhotoPage.java(单张照片);
  • ManageCachePage.java(缓存管理);
  • SlideShowPage.java(单张滑屏界面);

    这四个窗口每个不是完整的Acitity实现的,每个窗口算是只属于Gallery的一个状态。Gallery和每个窗口的类关系图如下。Gallery重新定义了资源上下文接口(GalleryContext类)和窗体接口(GalleryActivity), 并在AbstractGalleryActivity中实现了这两个接口。这样做的目的是为了扩展资源上下文的管理和窗体(Activity)的管理。在AbstractGalleryActivity中实现了一个重要的接口。

   

    public synchronized StateManager getStateManager() {
        if (mStateManager == null) {
            mStateManager = new StateManager(this);
        }
        return mStateManager;
    }

   这些界面类父类为ActivityState.java,这些界面的切换由StateManager.java负责。StateManager类负责管理所有ActivityState的派生类

 

三.Gallery2的窗体切换过程

  1. Gallery初始化时进入AlbumSetPage(相册缩略图页)。AbstractGalleryActivity类中getStateManager()接口初始化了StateManager实例;Gallery中调用该接口得到StateManager实例,使用StateManager实例的接口public void startState(Class<? extends ActivityState> klass,Bundle data);转入某个状态。例如Gallery初始化时默认将窗口切换到AlbumSetPage(相册缩略图页)。代码如下:
        public void startDefaultPage() {
            ...
            Bundle data = new Bundle();
            data.putString(AlbumSetPage.KEY_MEDIA_PATH,
                    getDataManager().getTopSetPath(DataManager.INCLUDE_ALL));
            ...
        }
     
  2. AlbumSetPage(相册缩略图页)点击某个缩略图时,转入到AlbumPage(相片缩略图页)。在AlbumSetPage类的private void pickAlbum(int slotIndex) 函数实现中有这样的代码:
        private void pickAlbum(int slotIndex) {
            ...
                data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath);
    
                // We only show cluster menu in the first AlbumPage in stack
                boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class);
                data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum);
                    //add for DRM feature: pass drm inclusio info to next ActivityState
                    if (IS_DRM_SUPPORTED) {
                        data.putInt(DrmHelper.DRM_INCLUSION, mMtkInclusion);
                    }
                mActivity.getStateManager().startStateForResult(
                        AlbumPage.class, REQUEST_DO_ANIMATION, data);
                ///M: avoid show selected icon when back from album page
            ...
        }
     
  3. AlbumPage(相片缩略图页)点击某张缩略图PhotoPage(单张相片页)。 
  4. 转入SlideshowPage(全屏相册页)。 
发布了15 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/lulu198709/article/details/41841897