Android4.2.2 Gallery2源码分析(10)——Activity于View的结合
来源:互联网 发布:linux云计算就业前景 编辑:程序博客网 时间:2024/06/07 14:41
在以往Activity中,我们大部分时候都在编写View,最后只需要在Activity的onCreate()函数中调用setContentView(new MyView())即可把对应的视图粘贴到了Activity上。在Gallery中,ActivityState代替了Activity;GLView代替了View,那么这二者是如何结合到一起的呢?
虽说ActivityState替代了Activity,但Android系统只认识Activity,最终呈现到屏幕上的仍然是一个Activity,只是在这个Activity下细分了更小的ActivityState来模拟Activity的行为。因此程序的总入口认识从Activity开始,这就是Gallery.java的onCreate()函数,Gallery.java继承自Activity。
- protected void onCreate(Bundle savedInstanceState) {
- ...
- setContentView(R.layout.main);
protected void onCreate(Bundle savedInstanceState) {... setContentView(R.layout.main);
- <merge xmlns:android="http://schemas.android.com/apk/res/android">
- <com.android.gallery3d.ui.GLRootView
- android:id="@+id/gl_root_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <com.android.gallery3d.ui.GLRootView android:id="@+id/gl_root_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
这是我们前面讨论过的Gallery的主界面是一个GLRootView对象。
GLRootView继承自GLSurfaceView,它的绘制内容主要在onDrawFrame()中完成,在这里我们发现了:
- if (mContentView != null) {
- //added for stereo display feature
- transformForStereo();
- mContentView.render(mCanvas);
- }
if (mContentView != null) { //added for stereo display feature transformForStereo(); mContentView.render(mCanvas); }
render是渲染函数,即把mContentView的内容在屏幕上画出来。这说明GLSurfaceView的内容完全由mContentView决定。那么这个mContentView是什么呢?
它是GLView类型的成员,在GLRootView.java中搜索这个成员变量,寻找它实例化的地方:
- public void setContentPane(GLView content) {
- if (mContentView == content) return;
- if (mContentView != null) {
- ...
- mContentView.detachFromRoot();
- BasicTexture.yieldAllTextures();
- }
- mContentView = content;
- ...
- }
public void setContentPane(GLView content) { if (mContentView == content) return; if (mContentView != null) {... mContentView.detachFromRoot(); BasicTexture.yieldAllTextures(); } mContentView = content;... }
而我们在ActivityState中发现了setContentPane的调用身影:- protected void setContentPane(GLView content) {
- mContentPane = content;
- ...
- mContentPane.setBackgroundColor(getBackgroundColor());
- mActivity.getGLRoot().setContentPane(mContentPane);//对GLRootView中该函数的调用
- }
protected void setContentPane(GLView content) { mContentPane = content;... mContentPane.setBackgroundColor(getBackgroundColor()); mActivity.getGLRoot().setContentPane(mContentPane);//对GLRootView中该函数的调用 }
在AlbumSetPage的onResume中我们知道了这个mContentPane的庐山真面目:
- public void onResume() {
- super.onResume();
- mIsActive = true;
- setContentPane(mRootPane);
public void onResume() { super.onResume(); mIsActive = true; setContentPane(mRootPane);
- private final GLView mRootPane = new GLView() {</SPAN>
private final GLView mRootPane = new GLView() {
因此总结Activity与View的结合如下:
Gallery对应于GLRootView这个对象,而GLRootView有很大的灵活性,它在Gallery细分为不同的ActivityState时实际渲染ActivityState中新建的GLView对象。
- Android4.2.2 Gallery2源码分析(10)——Activity于View的结合
- Android4.2.2 Gallery2源码分析(10)——Activity于View的结合
- Android4.2.2 Gallery2源码分析(8)——假装的Activity
- Android4.2.2 Gallery2源码分析(8)——假装的Activity
- Android4.2.2 Gallery2源码分析(4)——GLCanvas.java
- Android4.2.2 Gallery2源码分析(5)——GLCanvasImpl.java
- Android4.2.2 Gallery2源码分析(6)——GLView.java
- Android4.2.2 Gallery2源码分析(4)——GLCanvas.java
- Android4.2.2 Gallery2源码分析(5)——GLCanvasImpl.java
- Android4.2.2 Gallery2源码分析(6)——GLView.java
- Android4.2.2 Gallery2源码分析(7)——canvas的调用堆栈
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- Android4.2.2 Gallery2源码分析(11)——Gallery的层次结构图
- Android4.2.2 Gallery2源码分析(7)——canvas的调用堆栈
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- Android4.2.2 Gallery2源码分析(11)——Gallery的层次结构图
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- Android4.2.2 Gallery2源码分析(3)——分析Gallery.java
- 基于live555的视频直播
- lightoj1038 - Race to 1 Again(概率DP)
- 努力ing
- 用抽象类设计计算二维平面图形面积的程序,在基类TDshape中设计纯虚函数area()和printName()......C++的158页5题
- live555 实现一个最简单的RTSP服务器
- Android4.2.2 Gallery2源码分析(10)——Activity于View的结合
- 记录一个博客地址
- 导出MySql数据库字典的PHP脚本
- SGU 131 Hardwood floor(状压DP)
- 前缀表达式
- Nginx的安装及配置
- Android消息处理机制
- 用Ant打Jar包--在Manifest中引用Classpath
- 匿名方法