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元素,具体有如下控件。

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


        渲染流程

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

public final ArrayList<Layer> updateList = new ArrayList<Layer>(); 
public final ArrayList<Layer> opaqueList = new ArrayList<Layer>(); 
public final ArrayList<Layer> blendedList = new ArrayList<Layer>(); 
public final ArrayList<Layer> hitTestList = new ArrayList<Layer>(); 
public final ArrayList<Layer> systemList = new ArrayList<Layer>();


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

        // Run the update pass.
        final Lists lists = sLists;
        synchronized (lists) {
            final ArrayList<Layer> updateList = lists.updateList;
            boolean isDirty = false;
            for (int i = 0, size = updateList.size(); i != size; ++i) {
                boolean retVal = updateList.get(i).update(this, mFrameInterval);
                isDirty |= retVal;
            }
            if (isDirty) {
                requestRender();
            }

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

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  目前市面上的Android技术书籍还比较少,Android 3D游戏开发的书籍更是没有。因此,在现在市面上,Android游戏开发的书籍特别是Android 3D游戏开发的书籍还是有相当大的市场需求。   《Android3D游戏开发技术详解与典型案例》既介绍了Android 3D游戏开发中必知必会的基础知识,同时通过7个真实案例向读者介绍Android 3D游戏的完整开发步骤,希望通过本书能够使读者尽快掌握Android 3D游戏开发的相关知识。 内容简介   《Android3D游戏开发技术详解与典型案例》主要以Android平台下3D游戏的开发为主题,并结合真实的案例向读者详细介绍了OpenGL ES的基础知识及3D游戏程序开发的整个流程。   全书分为两篇共22章,第一篇以简单易懂的实例为依托,详细介绍了OpenGL ES各方面的基础知识,第二篇则对7个真实案例的开发步骤进行了详细的介绍,逐步向读者讲解Android 3D游戏的真实开发过程,同时代码中还包含了详细的注释,以尽量帮助读者掌握代码中的每一个细节,尽快掌握Android 3D游戏开发。   本书的讲述由浅入深,从Android平台下3D游戏开发应用的基础知识到开发大型游戏程序,结构清晰、语言简洁,非常适合初学者和进阶开发者阅读参考。   《Android3D游戏开发技术详解与典型案例》的讲述由浅入深,从Android平台下3D游戏开发应用的基础知识到开发大型游戏程序,结构清晰、语言简洁,非常适合初学者和进阶开发者阅读参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值