上次我们探讨了Android 4.0中Gallery3d中的视频播放器,现在剩下的代码非常的多,我们先整体看下有那些包

com.android.gallery3d.anim;//动画
com.android.gallery3d.app;//应用
com.android.gallery3d.common;//通用
com.android.gallery3d.data;//数据源
com.android.gallery3d.gadget;//小部件
com.android.gallery3d.onetimeinitializer;//小部件
com.android.gallery3d.photoeditor;//编辑图片
com.android.gallery3d.photoeditor.actions;//编辑图片
com.android.gallery3d.photoeditor.filters;//
com.android.gallery3d.picasasource;//毕加索
com.android.gallery3d.provider;//provider
com.android.gallery3d.settings;//设置
com.android.gallery3d.ui;//UI
com.android.gallery3d.util;//通用

光是包就不少,十几个,不过Android做了分类,这点是很好的改进,毕竟类增加了非常多,不分类就更难看了。

我们还是先从app包中的Gallery.java看起吧

public final class Gallery extends AbstractGalleryActivity implements OnCancelListener {}

并没有继承Activity,而是一个AbstractGalleryActivity,看下这个类

public class AbstractGalleryActivity extends Activity implements GalleryActivity {}

看起来只是增加对Activity加了个接口的实现,我们看下这个接口要实现什么

public interface GalleryActivity extends GalleryContext {public StateManager getStateManager();public GLRoot getGLRoot();public GalleryActionBar getGalleryActionBar();public OrientationManager getOrientationManager();public TransitionStore getTransitionStore();
}

第一个是状态管理器,还记得2.3中使用不同的状态切换界面么,4.0也采取了类似的办法,

第二个getGLRoot(),看起来Android还是要用OpenGL来画啊?

第三个是GalleryActionBar,ActionBar是2.3上面没有的东西,一个通用的控件而已,一个条型的控件

第四个是定向管理器,

第五个是过渡存储包,这两个比较难理解,后面再看代码理解吧。

我发现4.0的Gallery原理和2.3里面的非常的像,2.3的理解好了之后,对于4.0的非常有帮助,而且4.0代码非常的庞大,没有基础会容易晕。

我们先按照2.3使用OpenGL的原理来看下,4.0 的Gallery3上的区别。

再AbstractGalleryActivity中我们先看OpenGL的相关内容

    @Overrideprotected void onSaveInstanceState(Bundle outState) {mGLRootView.lockRenderThread();try {super.onSaveInstanceState(outState);getStateManager().saveState(outState);} finally {mGLRootView.unlockRenderThread();}}

这个函数的作用是什么?上网自己查,我就不讲了。

    @Overrideprotected void onResume() {super.onResume();mGLRootView.lockRenderThread();try {getStateManager().resume();getDataManager().resume();} finally {mGLRootView.unlockRenderThread();}mGLRootView.onResume();mOrientationManager.resume();}
    @Overrideprotected void onPause() {super.onPause();mOrientationManager.pause();mGLRootView.onPause();mGLRootView.lockRenderThread();try {getStateManager().pause();getDataManager().pause();} finally {mGLRootView.unlockRenderThread();}MediaItem.getMicroThumbPool().clear();MediaItem.getThumbPool().clear();MediaItem.getBytesBufferPool().clear();}

发现都指向了一个叫做mGLRootView的成员变量,保持和这个同步动作。

import com.android.gallery3d.ui.GLRoot;
import com.android.gallery3d.ui.GLRootView;

发现还导入了一个类,GLRoot,而且在

    public GLRoot getGLRoot() {return mGLRootView;}

注意mGLRootView是GLRootView的实例,为什么要返回一个GLRoot的类型呢?

我们看下这两个类都是什么关系

public class GLRootView extends GLSurfaceViewimplements GLSurfaceView.Renderer, GLRoot {}

我们发现GLRootView就是我们以前所说的RenderView,负责控制所有的层和刷新用的。

而GLRoot只是个接口

public interface GLRoot {}

既然GLRootView就是原来的RenderView,那么我们去找渲染刷新的函数,看看消息处理是不是也在里面

   public void onDrawFrame(GL10 gl) {}

发现这个里面并没有消息处理,估计Android工程师觉得将消息处理写在渲染里面纯属乱搞啊,属于恶意搞乱代码结构,我觉得虽然那样是很巧妙,但是也带来了一些问题,比如多点触摸的实现比较麻烦。

android使用了比较正规的办法dispatchTouchEvent来处理触摸事件,然后在mContentView.dispatchTouchEvent各个页面中(注意没有用Layer,而是用的Page或者说View)

    @Overridepublic boolean dispatchTouchEvent(MotionEvent event) {if (!isEnabled()) return false;int action = event.getAction();if (action == MotionEvent.ACTION_CANCEL|| action == MotionEvent.ACTION_UP) {mInDownState = false;} else if (!mInDownState && action != MotionEvent.ACTION_DOWN) {return false;}if (mCompensation != 0) {event.transform(mCompensationMatrix);}mRenderLock.lock();try {// If this has been detached from root, we don't need to handle eventboolean handled = mContentView != null&& mContentView.dispatchTouchEvent(event);if (action == MotionEvent.ACTION_DOWN && handled) {mInDownState = true;}return handled;} finally {mRenderLock.unlock();}}

有个问题,说是分发触摸消息,但是没有循环,只有一个调用啊?

是的,Android采用的办法并不是分层,而是分页面的办法,每个界面都在一个页面里面,每次只要切换页面就可以了,切换页面的时候将mContentView的值设置成制定的页面就可以了。我考虑Android想的是分层将很多控件写在一个层里面,靠隐藏和显示切换,这样有点乱。这个改动是比较好的。

那么这个mContentView的值是什么时候修改的呢?

    @Overridepublic void setContentPane(GLView content) {if (mContentView == content) return;if (mContentView != null) {if (mInDownState) {long now = SystemClock.uptimeMillis();MotionEvent cancelEvent = MotionEvent.obtain(now, now, MotionEvent.ACTION_CANCEL, 0, 0, 0);mContentView.dispatchTouchEvent(cancelEvent);cancelEvent.recycle();mInDownState = false;}mContentView.detachFromRoot();BasicTexture.yieldAllTextures();}mContentView = content;if (content != null) {content.attachToRoot(this);requestLayoutContentPane();}}

那么SetContentPane这个函数又是谁调用的呢?

在页面的OnResume的时候

    public void onResume() {super.onResume();mIsActive = true;setContentPane(mRootPane);

而Page里面没有实现这个方法,是继承于ActivityState,你会发现Page都是继承于他的,那他又是如何实现的呢?

    protected void setContentPane(GLView content) {mActivity.getGLRoot().setContentPane(content);}

转了几个弯,才调用到我们的setContentPane,实现了Page和GlrootView的关联,并实现了触摸消息的分发。

看起来,Android的实现更为精致一些,这次就说到这里吧。休息,休息一会,下次再说。

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

  1. mybatis学习笔记(13)-延迟加载

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(13)-延迟加载 标签: mybatis [TOC] resultMap可以实现高级映射(使用asso ...

  2. opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版

    基础版学习笔记: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 基础版形态学: opencv学 ...

  3. Linux学习笔记13

    Linux学习笔记13 Linux学习笔记13 配置Nagios 基本介绍 Nagios安装 - 服务端 Nagios安装 - 客户端 监控中心添加被监控主机 配置文件的简单说明 继续添加需要服务端通 ...

  4. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架

    Hadoop学习笔记-13.分布式集群中节点的动态添加与下架 开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如 ...

  5. 台大李宏毅Machine Learning 2017Fall学习笔记 (13)Semi-supervised Learning

    台大李宏毅Machine Learning 2017Fall学习笔记 (13)Semi-supervised Learning 本博客参考整理自: http://blog.csdn.net/xzy_t ...

  6. java 量化指标_量化投资学习笔记13——各种指标的绘图、计算及交易策略

    <量化投资:以python为工具>第五部分笔记 先来画k线图,要注意finance模块已经从matplotlib库中去除,现在要用mpl_finance库,单独安装. 其中有candles ...

  7. 【计算机网络学习笔记13】交换技术(下)

    [计算机网络学习笔记13]交换技术(下) 一.生成树的诞生和发展 1. 环路问题 两个网桥之间的连接网线如果只有一根,而这根网线或者接口有问题,网络就会出现单点故障.所以为了提高可靠性,网桥在互连时一 ...

  8. R语言小白学习笔记13—基本统计

    R语言小白学习笔记13-基本统计 笔记链接 学习笔记13-基本统计 13.1 概括性统计量 13.2 相关系数和协方差 13.3 t-检验 13.3.1 单样本t检验 13.3.2 两样本t检验 13 ...

  9. Excel VBA 学习笔记13:单元格的格式

    Excel VBA 学习笔记13:单元格的格式 NumberFormat 属性 (Excel) vba excel 单元格格式设置 Excel VBA 单元格格式 python解决SNIMissing ...

最新文章

  1. fegin通信中速度慢等待解决异常
  2. hadoop和python的关系_Python 的 map 和 reduce 和 Hadoop 的 MapReduce 有什么关系?
  3. python怎么画简单图片-python中简单易学的绘图:用turtle画太极图
  4. switch分支结构
  5. optee3.14.0 qemu_v8的环境搭建篇(ubuntu20.10)--终极篇
  6. 【计算机基础】存储器层次 Memory hierarchy
  7. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...
  8. docfx组件介绍--MarkdownLite
  9. 普通人能用华为P30拍出银河么?这是我们在北京实拍的结果
  10. JavaScript 简介 1
  11. unix操作系统图标大全
  12. 录音转文字 android,录音转文字pro
  13. 浅谈NFC、RFID、红外、蓝牙的区别
  14. 【Vue】postman汉化教程 保姆级教程 包教会
  15. jQuery实现轮播(jQuery究竟有多好用)
  16. SEDA源码解读(二)
  17. 什么是BPM工具?BPM工具有哪些功能?白码详解
  18. 还记得小时候玩的泡泡龙吗?用CocosCreator实现它!
  19. 生肖猪鼠年运程面面观
  20. FCN全卷积网络—upsampling(上采样)——OpenCV图像金字塔

热门文章

  1. 吐槽百度网盘限速,这种操作太恶心了
  2. 2018 php面试题
  3. php开发环境搭建和基础入门
  4. IT信息技术-1.1 信息系统与信息化
  5. 【JavaWeb】JSP技术详解
  6. 使用c语言实现复数运算的程序,用C语言实现的复数运算程序设计
  7. 天刀论剑显示服务器,论剑段位赛关闭 11月25日服务器维护公告
  8. CNSD/Echarts图的使用
  9. 鼠标hover出现遮罩
  10. 前端学习案例16-js中的HMR