转自: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. }
  8. if (isDirty) {
  9. requestRender();
  10. }

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

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

  24. // Run the blended pass.
  25. gl.glEnable(GL11.GL_BLEND);
  26. final ArrayList<Layer> blendedList = lists.blendedList;
  27. for (int i = 0, size = blendedList.size(); i != size; ++i) {
  28. final Layer layer = blendedList.get(i);
  29. if (!layer.mHidden) {
  30. layer.renderBlended(this,gl);
  31. }
  32. }
  33. gl.glDisable(GL11.GL_BLEND);

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

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android(安卓)Java 线程池 ThreadPoolExecutor源码篇
  3. android IllegalStateException
  4. 使用 Annotation 改善 Android(安卓)代码
  5. android4.2 长按POWER键3秒关机
  6. 解决android sdk docs帮助文档打开慢的问题
  7. Android(安卓)开发: eclipse更新SDK,eclipse如何更新SDK
  8. Android仿Iphone图标抖动效果
  9. android多线程读取网页内容

随机推荐

  1. 【Android】获取手机中已安装apk文件信息
  2. Android工程师成长路线全攻略
  3. 《Qt on Android核心编程》相关资源
  4. Android 调用系统相机以及相册源码
  5. 在android 中利用button 按钮设置监听事
  6. 一个Android开发者自学Python的心路历程
  7. Android(安卓)学习笔记 -- 环境搭建
  8. Android(安卓)adb.exe程序启动不起来 具
  9. activity状态的保存和保持(onRetainNonCo
  10. 解读2015之Android篇:横向扩张、平稳发展