Gallery3d 学习笔记(13)
上次我们探讨了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)相关推荐
- mybatis学习笔记(13)-延迟加载
2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(13)-延迟加载 标签: mybatis [TOC] resultMap可以实现高级映射(使用asso ...
- opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版
基础版学习笔记: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 基础版形态学: opencv学 ...
- Linux学习笔记13
Linux学习笔记13 Linux学习笔记13 配置Nagios 基本介绍 Nagios安装 - 服务端 Nagios安装 - 客户端 监控中心添加被监控主机 配置文件的简单说明 继续添加需要服务端通 ...
- Hadoop学习笔记—13.分布式集群中节点的动态添加与下架
Hadoop学习笔记-13.分布式集群中节点的动态添加与下架 开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如 ...
- 台大李宏毅Machine Learning 2017Fall学习笔记 (13)Semi-supervised Learning
台大李宏毅Machine Learning 2017Fall学习笔记 (13)Semi-supervised Learning 本博客参考整理自: http://blog.csdn.net/xzy_t ...
- java 量化指标_量化投资学习笔记13——各种指标的绘图、计算及交易策略
<量化投资:以python为工具>第五部分笔记 先来画k线图,要注意finance模块已经从matplotlib库中去除,现在要用mpl_finance库,单独安装. 其中有candles ...
- 【计算机网络学习笔记13】交换技术(下)
[计算机网络学习笔记13]交换技术(下) 一.生成树的诞生和发展 1. 环路问题 两个网桥之间的连接网线如果只有一根,而这根网线或者接口有问题,网络就会出现单点故障.所以为了提高可靠性,网桥在互连时一 ...
- R语言小白学习笔记13—基本统计
R语言小白学习笔记13-基本统计 笔记链接 学习笔记13-基本统计 13.1 概括性统计量 13.2 相关系数和协方差 13.3 t-检验 13.3.1 单样本t检验 13.3.2 两样本t检验 13 ...
- Excel VBA 学习笔记13:单元格的格式
Excel VBA 学习笔记13:单元格的格式 NumberFormat 属性 (Excel) vba excel 单元格格式设置 Excel VBA 单元格格式 python解决SNIMissing ...
最新文章
- fegin通信中速度慢等待解决异常
- hadoop和python的关系_Python 的 map 和 reduce 和 Hadoop 的 MapReduce 有什么关系?
- python怎么画简单图片-python中简单易学的绘图:用turtle画太极图
- switch分支结构
- optee3.14.0 qemu_v8的环境搭建篇(ubuntu20.10)--终极篇
- 【计算机基础】存储器层次 Memory hierarchy
- python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...
- docfx组件介绍--MarkdownLite
- 普通人能用华为P30拍出银河么?这是我们在北京实拍的结果
- JavaScript 简介 1
- unix操作系统图标大全
- 录音转文字 android,录音转文字pro
- 浅谈NFC、RFID、红外、蓝牙的区别
- 【Vue】postman汉化教程 保姆级教程 包教会
- jQuery实现轮播(jQuery究竟有多好用)
- SEDA源码解读(二)
- 什么是BPM工具?BPM工具有哪些功能?白码详解
- 还记得小时候玩的泡泡龙吗?用CocosCreator实现它!
- 生肖猪鼠年运程面面观
- FCN全卷积网络—upsampling(上采样)——OpenCV图像金字塔