上个回合我们讲到触摸的响应在一个层的列表中找到,但是没有找到层的关联和添加。
到底又几个层被加入了?有几个层LIST?到底什么时候添加进去的?还是先看RenderView.java
private static final Lists sLists = new Lists();
看下这个内部类的组成
public static final class Lists { 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>(); void clear() { updateList.clear(); opaqueList.clear(); blendedList.clear(); hitTestList.clear(); systemList.clear(); } }
这些层的列表的作用:
updateList: 包含需要是否渲染的层
opaqueList:包含需要绘制不透明部分的层
blendedList:包含需要绘制半透明的层
systemList:加入这个list中的层会调用onSurfaceCreate方法
hitTestList:包含需要测试是否被点击的层,看起来是测试用的?反正他做了触摸点击的处理,后面看他们怎么做的。
有几个类和这些有关系:
GridLayer.java -----> Layer
HudLayer.java -----> Layer
ImageButton.java -----> Layer
MenuBar.java -----> Layer
PathBarLayer.java -----> Layer
PopMenu.java -----> Layer
TimerBar.java -----> Layer
BackgroundLayer -----> Layer
关系的函数是 ----> generate, 为什么是这个函数,谁告诉我,不能光看不思考,想想为什么?
代码里面有所有的答案,大家还记得上次RendView中的刷新的代码么?
if (mListsDirty) { updateLists(); }
private void updateLists() { if (mRootLayer != null) { synchronized (sLists) { sLists.clear(); mRootLayer.generate(this, sLists); } } }
刷新时,会调用到根层的generate方法。我再问个问题根层是那个层?我上次笔记里面写过的哦?
mGridLayer,就是和Acitity关联的那个root Layer.
好,我再问一个问题,为什么只调用了root Layer的generate方法,其他层的generate并没有人调用啊?
我们看下抽象类 ,Layer
public abstract class Layer { public abstract void generate(RenderView view, RenderView.Lists lists); }
再看下根层GridLayer的实现
@Override public void generate(RenderView view, RenderView.Lists lists) { lists.updateList.add(this); lists.opaqueList.add(this); mBackground.generate(view, lists); lists.blendedList.add(this); lists.hitTestList.add(this); mHud.generate(view, lists); }
这段代码说明了什么?
说明在RenderView里面只生成了Root Layer,再由Root Layer生成剩下的层,剩下的层再生成更多的层。
HudLayer的实现
@Override public void generate(RenderView view, RenderView.Lists lists) { lists.opaqueList.add(this); lists.blendedList.add(this); lists.hitTestList.add(this); lists.updateList.add(this); mTopRightButton.generate(view, lists); mZoomInButton.generate(view, lists); mZoomOutButton.generate(view, lists); mTimeBar.generate(view, lists); mSelectionMenuTop.generate(view, lists); mSelectionMenuBottom.generate(view, lists); mFullscreenMenu.generate(view, lists); mPathBar.generate(view, lists); // mLoadingLayer.generate(view, lists); mView = view; }
我们看到HudLayer被Root层生成后,起到了一个很重要的作用,生成了大多数层,并且将 RendView保存再自己的成员变量中了。
ImageButton
@Override public void generate(RenderView view, Lists lists) { lists.updateList.add(this); lists.blendedList.add(this); lists.hitTestList.add(this); }
MenuBar
@Override public void generate(RenderView view, RenderView.Lists lists) { lists.blendedList.add(this); lists.hitTestList.add(this); lists.systemList.add(this); lists.updateList.add(this); mSubmenu.generate(view, lists); }
PathBar
@Override public void generate(RenderView view, RenderView.Lists lists) { lists.blendedList.add(this); lists.hitTestList.add(this); lists.updateList.add(this); }
PopMenu
@Override public void generate(RenderView view, RenderView.Lists lists) { lists.blendedList.add(this); lists.hitTestList.add(this); lists.systemList.add(this); lists.updateList.add(this); }
TimeBar
@Override public void generate(RenderView view, Lists lists) { lists.updateList.add(this); lists.blendedList.add(this); lists.hitTestList.add(this); }
基本的图型如下:
RendView---->RootLayer ----> HudLayer ----->ImageButton TimeBar MenuBar PathBar Layer
----->BackgroundLayer
在添加本地的层到对应的层列表的时候,hiTestList和blendedList和updateList都会有,systemList和opaquList不是都有,为什么?
当然有个例外背景层。
BackgroundLayer
@Override public void generate(RenderView view, Lists lists) { lists.blendedList.add(this); lists.updateList.add(this); lists.opaqueList.add(this); }
当然这些都是根据需要的,背景需要不透明并且不需要响应触摸点击事件,当然没有hiTestList,有opaqueList层。
那既然有这么多的层已经被组织好了,放在一个Activity 中,那什么时候显示那个层,或者说他们是怎么切换不同的界面呢?而且层与我们看到的各个界面又是如何关联的?
且听下回分解。