现在的位置: 首页 > 综合 > 正文

Gallery3d 学习笔记(5)

2013年01月05日 ⁄ 综合 ⁄ 共 3868字 ⁄ 字号 评论关闭

上个回合我们讲到触摸的响应在一个层的列表中找到,但是没有找到层的关联和添加。

到底又几个层被加入了?有几个层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 中,那什么时候显示那个层,或者说他们是怎么切换不同的界面呢?而且层与我们看到的各个界面又是如何关联的?

且听下回分解。

抱歉!评论已关闭.