继续讲解前,我们先回顾一下前面5节的分析。

首先在开机或者加载外部存储器时,在mediaprivder里面receiver会得到广播消息,receiver开启服务进行扫描,生成数据库,并在T卡上生成缩略图临时文件,

然后在第一个Activity里面有两个关于opengl的成员,RenderView和作为Root Layer 的GridLayer成员,并且关联了RenderView和Root Layer,并且在Activity里面通过调用RenderView的同名成员函数的办法,将按键响应以及渲染的暂停和继续同Activity同步关联。

而RenderView在刷新时,通过调用generate接口,生成Root层的,Root层调用generate接口生成背景层和Hud层,同样的办法Hud层生成其他的层,并将RendView保存到自己的成员变量中。

而这些层又分成了几个类,放在几个层的列表中,决定哪些层响应点击事件,哪些层透明。

现在我们要分析的问题是,界面和层是如何关联的,又是如何切换的?

这个问题比较多,会花几个部分解决。

我们先探讨一个小的问提,我们先使用下Gallery3d ,你会发现长按键后可以标记相册或者单一图片或者视频。

说明Gallery3d里面又两种模式,普通模式和选择模式对应的代码是在HudLayer中:

public final class HudLayer extends Layer {public static final int MODE_NORMAL = 0;public static final int MODE_SELECT = 1;

那么在关键的HudLayer中又用了两个方法来读取和设置模式

    int getMode() {return mMode;}void setMode(int mode) {if (mMode != mode) {mMode = mode;updateViews();}}

在哪里调用的呢

    public void enterSelectionMode() {// Do not enter selection mode if the feed is about to change.if (mGridLayer.feedAboutToChange())return;// Disable sharing if it is the pick intent.if (mGridLayer.getPickIntent()) {mSingleViewIntentBottomMenu = mSingleViewIntentBottomMenuNoShare;mNormalBottomMenu = mNormalBottomMenuNoShare;}setAlpha(1.0f);setMode(HudLayer.MODE_SELECT);// if we are in single view mode, show the bottom menu without the// delete button.if (mGridLayer.noDeleteMode()) {mSelectionMenuBottom.setMenus(mSingleViewIntentBottomMenu);} else {mSelectionMenuBottom.setMenus(mNormalBottomMenu);}}
    public void cancelSelection() {mSelectionMenuBottom.close();closeSelectionMenu();setMode(MODE_NORMAL);}

就是通过HudLayer中的进入选择模式和退出选择模式来切换模式的和菜单的显示。那么从用户长按又是如何到enterSelectMode函数的呢?

首先触摸是各个层里面处理的,而按键都是Root Layer处理的,谁是Root Layer,当然是GridLayer,我们看下GridLayer是如何处理的

    @Overridepublic boolean onTouchEvent(MotionEvent event) {return mInputProcessor.onTouchEvent(event);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (mInputProcessor != null)return mInputProcessor.onKeyDown(keyCode, event, mState);return false;}

说明所有GridLayer的按键和触摸都交给了一个叫做mInputProcessor的成员去处理了。对应的是

GridInputProcessor类

这个类又是如何处理的呢?

 public void onLongPress(MotionEvent e) {if (mZoomGesture)return;if (mLayer.getFeed() != null && mLayer.getFeed().isSingleImageMode()) {HudLayer hud = mLayer.getHud();hud.getPathBar().setHidden(true);hud.getMenuBar().setHidden(true);if (hud.getMode() != HudLayer.MODE_NORMAL)hud.setMode(HudLayer.MODE_NORMAL);}if (mCurrentFocusSlot != Shared.INVALID) {vibrateLong();GridLayer layer = mLayer;if (layer.getState() == GridLayer.STATE_FULL_SCREEN) {layer.deselectAll();}HudLayer hud = layer.getHud();hud.enterSelectionMode();layer.addSlotToSelectedItems(mCurrentFocusSlot, true, true);}}

那么,我们重新整理下思路:

用户长按 Activity --> 因为Acitvity中的触摸是层里面处理的,所以给了根层GridLayer去处理,而GridLayer嫌麻烦,另外写了一个类GridInputProcessor的成员处理,而再这个类中,调用通过传进来的GridLayer上下文和方法 getHud获得了Hud层的对象,然后调用他的enterSelectionMode方法,将状态设置成了选择模式。

长按和处理我们看完了,其他的拖动和点击请自己再分析下,作为今天的作业吧,呵呵。

那么我们再来看GridLayer界面的显示,再构造函数我们可以看到下面的代码。

        mCameraManager = new GridCameraManager(mCamera);mDrawManager = new GridDrawManager(context, mCamera, mDrawables, mDisplayList, mDisplayItems, mDisplaySlots);mInputProcessor = new GridInputProcessor(context, mCamera, this, mView, mTempVec, mDisplayItems);

mDrawManager就是负责界面的显示的。我们仔细看下。

大家还记得RenderView里面对三组层的列表进行的统一刷新么?

其中对opaque层是怎么刷新的,使用的是一个循环,加上调用层的renderOpaque方法,那么我们来看这个里面是否有?我们看GridLayer层的刷新函数

    // Renders the node in a given pass.public void renderOpaque(RenderView view, GL11 gl) {GridCamera camera = mCamera;int selectedSlotIndex = mInputProcessor.getCurrentSelectedSlot();computeVisibleItems();gl.glMatrixMode(GL11.GL_MODELVIEW);gl.glLoadIdentity();GLU.gluLookAt(gl, -camera.mEyeX, -camera.mEyeY, -camera.mEyeZ, -camera.mLookAtX, -camera.mLookAtY, -camera.mLookAtZ,camera.mUpX, camera.mUpY, camera.mUpZ);view.setAlpha(1.0f);if (mSelectedAlpha != 1.0f) {gl.glEnable(GL11.GL_BLEND);gl.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);view.setAlpha(mSelectedAlpha);}if (selectedSlotIndex != Shared.INVALID) {mTargetAlpha = 0.0f;} else {mTargetAlpha = 1.0f;}mDrawManager.prepareDraw(mBufferedVisibleRange, mVisibleRange, selectedSlotIndex, mInputProcessor.getCurrentFocusSlot(),mInputProcessor.getCurrentScaledSlot(), mInputProcessor.isFocusItemPressed(), mInputProcessor.getScale(),mInputProcessor.getScaleGestureDetector(), mFeedAboutToChange);if (mSelectedAlpha != 0.0f) {mDrawManager.drawThumbnails(view, gl, mState);}if (mSelectedAlpha != 1.0f) {gl.glDisable(GL11.GL_BLEND);}// We draw the selected slotIndex.if (selectedSlotIndex != Shared.INVALID) {mDrawManager.drawFocusItems(view, gl, mZoomValue, mSlideshowMode, mTimeElapsedSinceView);mCurrentFocusItemWidth = mDrawManager.getFocusQuadWidth();mCurrentFocusItemHeight = mDrawManager.getFocusQuadHeight();}view.setAlpha(mSelectedAlpha);}

在这里面,我们找到了实质性刷界面的函数

ComputerVisibleItem();计算可见项目

mDrawManager.prepareDraw准备工作

mDrawManager.drawThumnails画缩略图

在这里我们看到了缩略图显示刷新,但是还有一些疑问,数据从哪里来的,而且这里只有一个界面的显示,其他的界面如何显示的?下次探讨吧。

Gallery3d 学习笔记(6)相关推荐

  1. Gallery3d 学习笔记(13)

    上次我们探讨了Android 4.0中Gallery3d中的视频播放器,现在剩下的代码非常的多,我们先整体看下有那些包 com.android.gallery3d.anim;//动画 com.andr ...

  2. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  3. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  5. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  6. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  7. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  8. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  9. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  10. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

最新文章

  1. ruby学习笔记(2)-chomp,chop的区别
  2. shell 脚本加密
  3. 【lua学习】3.字符串
  4. matlab多变量频域设计工具箱,10.4.3用MATLAB实现连续系统的频域分析.ppt
  5. 关于onload的事件权柄以及踩过的坑
  6. Entity Framework 6 Recipes 2nd Edition(11-5)译 - 从”模型定义”函数返回一个匿名类型...
  7. 用Response.Filter生成静态页
  8. Python知识点汇总
  9. c语言代码表白_程序员教你表白:C/C++打造浪漫表白程序,找女朋友从现在开始...
  10. 2018-2019-1 20165201 实验四 外设驱动程序设计
  11. PingFang(苹方)字体的引用
  12. 教您简单几步实现工业树莓派正确安装RS232转USB驱动
  13. visio2003乱码问题
  14. qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in
  15. linux宝塔面板下安装mindoc参考
  16. win10dnf服务器未响应,win10专业版dnf老是未响应是什么原因?电脑配置没问题呀
  17. t检验临界值表中的n是什么_t检验临界值分布表
  18. 对话MVP | 清华博士马福辰:希望成为社区和生态发展强有力的“助攻”
  19. [UE4]射击产生弹孔:Spawn Decal At Location、Spawn Decal Attached
  20. SpringBoot文件上传与校验

热门文章

  1. 三角形边长求高的c语言函数公式,各种三角形边长的计算公式-三角形三边公式...
  2. 双显卡(Intel+Nvidia)笔记本配置cuda开发环境
  3. P4234(最小差值生成树 lct维护生成树)
  4. Excel同时打开两个窗口的方法
  5. 今天要学习的技术点,Python 筛选数字,模块导入,特殊变量__all__ 实战博客
  6. 两直线平行交叉相乘_十字交叉双乘法没有公式
  7. Flutter 编译失败shared_preferences_macos
  8. ModbusRTU协议数据格式
  9. mysql中year()_MySQL year()函数
  10. TZOJ5855: 数据结构实验:最短路(SPFA)