当前位置: 首页 > article >正文

android gallery3d 源码分析(一)

转自:http://www.eoeandroid.com/thread-83537-1-1.html

Gallery3D概述


       Gallery3D的界面生成和普通的应用程序不一样。普通程序一般一个界面就是一个activity,布局用xml或代码都可以实现,界面切换是activity的切换方式;而Gallery3D没有用android的UI系统,而是用opengl画出来的,即界面是在同一个activity的,如主界面,缩略图界面,单张图片查看界面,标记界面等都属于同一个activity。

         主要线程介绍

        在应用程序中有三个非常重要的线程存在:主线程(Gallery随activity的生命周期启动销毁)、MediaFeed初始化线程(进入程序时只运行一次,用于加载相册初始信息)、MediaFeed监听线程(一直在跑,监听相册和相片的变更),其中MediaFeed初始化线程的工作是:调用MediaFeed 的loadMediaSets加载相册,MediaFeed监听线程MediaFeed.run()的工作是:根据“内容变化监听器“返回的媒体变动消息 (增删改),持续不断的更新 MediaFeed中的相册和相片变量。

        控件
       Gallery3D中定义了很多控件它们都继承自com.cooliris.media.Layer,分别代表不同场景和界面下的UI元素,具体有如下控件。

java代码:
  1. com.cooliris.media.GridLayer :                         网格所略图显示和单个图片显示
  2. com.cooliris.media.BackgroundLayer :             背景
  3. com.cooliris.media.HudLayer :                         相册显示
  4. com.cooliris.media.ImageButton :                    图片按钮(主要指进入Gallery后右上角的那个控件)
  5. com.cooliris.media.TimeBar :                            进入Gallery后下方可拖动的悬浮控件
  6. com.cooliris.media.MenuBar :                          点击图片时弹出的菜单按钮
  7. com.cooliris.media.PopupMenu :                     点击菜单按钮后弹出来的菜单项
  8. com.cooliris.media.PathBarLayer :                   如今Gallery后左上方显示图片路径的空间

复制代码

        渲染流程

        Gallery3D的渲染从 RenderView 开始。RenderView 从 GLSurfaceView 继承而来,采用了通知型绘制模式,即通过调用requestRender 通知 RenderView 重绘屏幕。RenderView 将所有需要绘制的对象都保存一个 Lists中,Lists 包含了5个ArrayList,其定义如下所示:

java代码:
  1. public final ArrayList<Layer> updateList = newArrayList<Layer>(); 
  2. public final ArrayList<Layer> opaqueList = newArrayList<Layer>(); 
  3. public final ArrayList<Layer> blendedList = newArrayList<Layer>(); 
  4. public final ArrayList<Layer> hitTestList = newArrayList<Layer>(); 
  5. public final ArrayList<Layer> systemList = new ArrayList<Layer>();

复制代码

         RenderView 的onDrawFrame接口完成每一帧的绘制操作,绘制时遍历 lists 里每个 list 的每一个成员并调用其 renderXXX 函数。主要代码如下所示:

java代码:
  1. final Lists lists = sLists; 

  2. final ArrayList<Layer> updateList = lists.updateList; 
  3. boolean isDirty = false; 
  4. for (int i = 0, size = updateList.size(); i != size; ++i) { 
  5. boolean retVal = updateList.get(i).update(this,mFrameInterval); 
  6. isDirty |= retVal; 

  7. if (isDirty) { 
  8. requestRender(); 


  9. // Clear the depth buffer. 
  10. gl.glClear(GL11.GL_DEPTH_BUFFER_BIT); 
  11. gl.glEnable(GL11.GL_SCISSOR_TEST); 
  12. gl.glScissor(0, 0, getWidth(), getHeight()); 

  13. // Run the opaque pass. 
  14. gl.glDisable(GL11.GL_BLEND); 
  15. final ArrayList<Layer> opaqueList = lists.opaqueList; 
  16. for (int i = opaqueList.size() - 1; i >= 0; --i) { 
  17. final Layer layer = opaqueList.get(i); 
  18. if (!layer.mHidden) { 
  19. layer.renderOpaque(this,gl); 



  20. // Run the blended pass. 
  21. gl.glEnable(GL11.GL_BLEND); 
  22. final ArrayList<Layer> blendedList = lists.blendedList; 
  23. for (int i = 0, size = blendedList.size(); i != size; ++i) { 
  24. final Layer layer = blendedList.get(i); 
  25. if (!layer.mHidden) { 
  26. layer.renderBlended(this,gl); 


  27. gl.glDisable(GL11.GL_BLEND); 

复制代码

系列之Android Gallery3D源码分析(二)的帖子链接 http://www.eoeandroid.com/thread-83538-1-1.html
http://www.lryc.cn/news/2419397.html

相关文章:

  • Winpcap的安装使用方法
  • 【论文笔记】Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized
  • iptables/netfilter/iproute2/ip/tc/qdisc经常被混淆的几个概念
  • 调色盘管理器
  • 熊猫烧香专杀工具的编写
  • 鱼哭了,水知道。我哭了,谁知道
  • 天虹办公系统kk服务器,客户齐点赞,蓝凌KK 7.0大幅提升工作效率
  • 老牌技术员系统更新啦!(x86/x64)装机版/纯净版 2016.08
  • 都掏出来了,大学四年珍藏的26个宝藏网站,全部整理好给大家!!!_珍藏网页 -广告
  • 认识处理器(CPU)
  • wifi-加载驱动
  • CryENGINE3系列总结教程之UI/HUD(一)制作生命条弹药条Flash部分
  • Maple 入门常用教程
  • 验证手机号码归属地_手机号码怎么查找位置
  • Linux磁盘管理系列 — 磁盘配额管理
  • 三大工厂模式的优缺点
  • UI控件之UIControl
  • .net 微服务实践
  • web程序生成excel
  • 推荐:音速启动(快捷方式分类管理工具)
  • 四大作用域
  • 关于FL Studio ASIO驱动不工作的一个解决方案
  • 智能魔法棒(手势控制器)———嵌入式篇
  • Mac OSX 卸载PKG包
  • uushare第二版功能详细介绍
  • ARM架构处理器MT6572的LK printf 与UART串口打印分析
  • 系统维护 电脑蓝屏代码大全
  • 鸿蒙HarmonyOS学习笔记之基于CommonDialog实现自定义PromptDialog
  • 蓝桥杯专题之日期篇
  • 基金01、03文件,92、94文件、52、53、59等文件是指什么?