RenderView
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>();
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 函数。主要代码如下所示:
- ...
-
final Lists lists = sLists;
-
-
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();
- }
-
-
- gl.glClear(GL11.GL_DEPTH_BUFFER_BIT);
- gl.glEnable(GL11.GL_SCISSOR_TEST);
-
gl.glScissor(0, 0, getWidth(), getHeight());
-
-
- 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);
- }
- }
-
-
- 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);
...
final Lists lists = sLists;
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);
lists 的各个 list 里包含的各个 layer 如下所示:
- lists
- |------------------|-----------------|-----------------|---------------|
- updateList opaqueList blendedList systemList hitTestList
- | | | | |
- GridLayer GridLayer GridLayer GridLayer GridLayer
- BackgroudLayer BackgroudLayer BackgroudLayer
- HudLayer HudLayer HudLayer HudLayer
- TimeBar TimeBar TimeBar
- PathBar PathBar PathBar
- XXXButton XXXButton XXXButton
- XXXMenu XXXMenu XXXMenu
lists
|------------------|-----------------|-----------------|---------------|
updateList opaqueList blendedList systemList hitTestList
| | | | |
GridLayer GridLayer GridLayer GridLayer GridLayer
BackgroudLayer BackgroudLayer BackgroudLayer
HudLayer HudLayer HudLayer HudLayer
TimeBar TimeBar TimeBar
PathBar PathBar PathBar
XXXButton XXXButton XXXButton
XXXMenu XXXMenu XXXMenu
Layer 类提供了 update(...), renderOpaque (...), renderBlended (...) 接口,从上面 RenderView 的 onDrawFrame 绘制代码可以看到,这些接口被调用。
- public abstract class Layer {
- ... ...
-
-
public abstract void generate(RenderView view, RenderView.Lists lists);
-
-
public boolean update(RenderView view, float frameInterval) {
-
return false;
- }
-
-
public void renderOpaque(RenderView view, GL11 gl) {
- }
-
-
public void renderBlended(RenderView view, GL11 gl) {
- }
- ... ...
-
- }
public abstract class Layer {
... ...
public abstract void generate(RenderView view, RenderView.Lists lists);
public boolean update(RenderView view, float frameInterval) {
return false;
}
public void renderOpaque(RenderView view, GL11 gl) {
}
public void renderBlended(RenderView view, GL11 gl) {
}
... ...
}
GridLayer
GridLayer 中有个 GridDrawManager,专门负责绘制。
下面是 GridDrawManager 的构造函数,从其参数里可以看出些门道。
- mDrawManager = new GridDrawManager(context, mCamera, mDrawables, sDisplayList, sDisplayItems, sDisplaySlots);
分享到:
相关推荐
Gallery3D源码分析
android Gallery3D 最新源码
gallery3D分析 Gallery3D中定义了很多控件它们都继承自com.cooliris.media.Layer,分别代表不同场景和界面下的UI元素,具体有如下控件 com.cooliris.media.GridLayer :网格所略图显示和单个图片显示 ...
Android Gallery3D 源码 已编译
Gallery 3D源码分析汇总,整理的还可以,分享下
安卓Android源码——Gallery3D.zip
Gallery 3D 分析 附源码
Gallery3D 源码 图库
froyo 的Gallery3D源码
Android控件开发之Gallery3D酷炫效果(带源码),功能简单,欢迎下载
最新android4.0gallery3d源码
android gallery3d源码,我测试过了,可以正常运行,希望对大家有用。
android2.2 Gallery3D解析
Gallery_3D_源码分析汇总
android Gallery3D 源码,已经编译过了。
Gallery3D
Android Gallery3D 源代码 图片浏览器
Gallery3D效果 一个完整的工程 Gallery3D效果
Gallery2源码流程说明,该Gallery2源码说明是基于高通平台。把Gallery2涉及的一些流程及知识点作了一些整理,有些也参考网上朋友的说明与介绍。希望对修改Gallery2的朋友提供一个思路。