博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Gallery2技术分析
阅读量:5973 次
发布时间:2019-06-19

本文共 2523 字,大约阅读时间需要 8 分钟。

概述

  图库和相机在内部实现上其实是共用的一个app,即Gallery2。它们是Gallery2的两个不同的入口。图库的主要功能是展示和管理设备中的或者网络上的媒体内容(照片、视频),虽然名字是图库,但是其功能不仅仅限于图片。其代码位于packages/apps/Gallery2。

UI技术分析

  打开图库应用首先看到的是相册缩略图,点击一个相册后进入这个相册中的照片的缩略图,点击一个照片的缩略图后进入单张照片模式。这些不同的UI之间的切换并没有使用不同的Activity,而是在同一个Actvity中进行的。这个Activity是GalleryActivity(有两个GalleryActivity,这儿指的是com.android.gallery3d.app包中的)。布局文件是main.xml,其主要内容如下:

接着看gl_root_group.xml,其内容如下:

  这就是图库UI实现的特殊之处。GLRootView继承自GLSurfaceView。实际上Gallery2基于GLSurfaceView实现了一套UI控件,这套UI组件画在这个GLSurfaceView上。Gallery2的图库功能的UI实现没有采用Android通常的View控件系统。Gallery2实现了GLView、GLRootView、GLCanvas等。GLView就相当于通常Android控件体系中的View,它是所有控件的父类。GLView可以接收触摸事件,并把自己画到GLCanvas上,GLCanvas是一个接口其实现有GLES11Canvas、GLES20Canvas。GLCanvas把自己绘制到GLSurfaceView中。接着说GLView,一个GLView可以有零个或多个子GLView,它们形成一个树结构。渲染和事件处理通过这个数结构传递。GLView必需加入到(Attach)GLRoot中才能完成渲染和接收事件。GLView可以通过调用GLRoot的requestRender()和requestLayoutContentPane()方法实现GLView树的渲染和布局。

  GLRootView除了继承自GLSurfaceView之外还实现了GLRoot接口。是所有GLView的根控件。即整个GLView树是添加在它上面的,这通过GLRootView的setContentPane方法实现,有些类似于Activity的setContentView。GLView的渲染在GL线程中进行,事件处理在主线程中进行。这两个线程需要同步。在事件处理和布局的时候GLRootView会获取一个锁,从而避免渲染线程在这个时候执行。这个锁就是GLRootView中的mRenderLock。
  总结一下就是Gallery2不同于一般app之处是它的控件从GLView继承而不是View,GLView渲染在GLSurfaceView中。Gallery2实现了自己的一套UI控件系统。

软件架构

  根据UI技术分析一节可以知道图库功能界面的切换本质上时GalleryActivity中GLSurfaceView中GLView的切换。或者可以说GalleryActivity有相册缩略图(AlbumSetPage)、相册照片缩略图(AlbumPage)、单张照片(PhotoPage)、幻灯片(SlideshowPage)四种不同的状态(ActivityState)。实际上AlbumSetPage、AlbumPage、PhotoPage、SlideshowPage都继承自ActivityState,并且它们之间的切换由StateManager来管理。每一个ActivityState都有一个GLView树,这个树的根节点是ActivityState中定义的mContentPane。

  对应AlbumSetPage、AlbumPage、PhotoPage、SlideshowPage分别是SlotView、SlotView、PhotoView、SlideshowView。对应的数据适配器分别是AlbumSetDataLoader、AlbumDataLoader、PhotoDataAdapter、SlideshowDataAdapter。用图形表示如下:
图片描述

数据模型和数据流分析

  数据适配器(Adapter)是数据到UI的桥梁,连接数据源和UI。Gallery2中数据源是MediaSource,MediaSource创建MediaObject实例,GLView渲染的就是一个个的MediaObject。MediaSource由DataManager管理,AlbumSetPage等ActivityState在初始化的时候会通过DataManager获取一个MediaObject,这个MediaObject就是ActivityState的数据的最终来源,即数据适配器的数据来源。界面(AlbumSetPage等ActivityState的子类)没有直接和MediaSource打交道,MediaSource被封装在了DataManager中。

  MediaSource的子类有LocalSource、PicasaSource、ComboSource(一个组合源,组合了LocalSource和PicasaSource的功能)、ClusterSource等。MediaObject有两个子类MediaSet和MediaItem。MediaSet是一个集合类,其元素是MediaItem类型。MediaSet又有子类LocalAlbumSet、ClusterAlbumSet、ComboAlbumSet、LocalAlbum、ClusterAlbum、ComboAlbum等。MediaItem又有子类LocalMediaItem、UriImage等。数据模型用图形表示就是:
图片描述

转载地址:http://hydox.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
IDE---Python IDE之Eric5在window下的安装
查看>>
Mybatis调用Oracle中的存储过程和function
查看>>
基本安装lnmp环境
查看>>
yum源资料汇总
查看>>
7、MTC与MTV,http请求介绍
查看>>
logstash消费阿里云kafka消息
查看>>
unix 环境高级编程
查看>>
MAXIMO 快速查找实现
查看>>
Oracle——条件控制语句
查看>>
第一次作业-准备篇
查看>>
day-6 and day-7:面向对象
查看>>
CSU Double Shortest Paths 湖南省第十届省赛
查看>>
webgl像机世界
查看>>
php正则怎么使用(最全最细致)
查看>>
javascript数学运算符
查看>>
LC.155. Min Stack(非优化,两个stack 同步 + -)
查看>>
交互设计[3]--点石成金
查看>>
SCCM TP4部署Office2013
查看>>
redis主从配置<转>
查看>>