资讯专栏INFORMATION COLUMN

Android Gallery2技术分析

coordinate35 / 3063人阅读

摘要:渲染和事件处理通过这个数结构传递。对应的数据适配器分别是。用图形表示如下数据模型和数据流分析数据适配器是数据到的桥梁,连接数据源和。由管理,等在初始化的时候会通过获取一个,这个就是的数据的最终来源,即数据适配器的数据来源。

概述

  图库和相机在内部实现上其实是共用的一个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等。数据模型用图形表示就是:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14057.html

相关文章

  • Android Gallery2技术分析

    摘要:渲染和事件处理通过这个数结构传递。对应的数据适配器分别是。用图形表示如下数据模型和数据流分析数据适配器是数据到的桥梁,连接数据源和。由管理,等在初始化的时候会通过获取一个,这个就是的数据的最终来源,即数据适配器的数据来源。 概述   图库和相机在内部实现上其实是共用的一个app,即Gallery2。它们是Gallery2的两个不同的入口。图库的主要功能是展示和管理设备中的或者网络上的媒...

    yedf 评论0 收藏0
  • 【腾讯Bugly干货分享】Android动态布局入门及NinePatchChunk解密

    摘要:使用定义布局的方式,有着结构清晰可预览等优势,因而极为通用。可是,偏偏在某些场景下,布局是需要根据运行时的状态变化的,无法使用预先定义。这时候,我们只能通过控制,在程序运行时,动态的实现对应的布局。这是动态布局中最基础最常用的步骤。 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7f... 作者:黄进——QQ...

    leanxi 评论0 收藏0
  • 腾讯安全Blade团队《Android 移动安全知识技术全解》Android安全【逆向】开发宝典,首

    摘要:作为国际顶级信息安全会议之一,专注于二进制安全领域,议题面向全球开放申请。移动安全的重要性说到安全方面的问题,这里必须说一下逆向了。移动安全知识技术全解资料是由腾讯安全团队编写的学习笔记,资料包含个知识点共计万字。 ...

    wangxinarhat 评论0 收藏0
  • 性能优化全新思路!实践腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析(附PDF源码)

    摘要:不努力不奋斗,可能就会在基层一辈子止步不前。不过,只一句,如果你还在做这一行,还是一名程序猿媛,想走上坡路的你,也许我这到手的十几家一线互联网公司性能优化项目实战可能会对你有所帮助。 ...

    ytwman 评论0 收藏0
  • android文章 - 收藏集 - 掘金

    摘要:使用也比较简单热修复技术空间补丁方案解析掘金如前文所述,要想实现热更新的目的,就必须在分包完成之后操作字节码文件。 Android内存优化——内存泄露检测分析方法 - 掘金上一篇文章总结了一些常见的内存泄露场景及优化方案,这篇文章继续总结内存泄露的一些常用的检测和分析方法。 Lint代码检查 AndroidStudio自动Lint代码检查工具,一些常见的代码警告Lint工具都会给我们提...

    pkhope 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<