您的位置:首页 > 移动开发 > Android开发

Android4.2.2 Gallery2源码分析(10)——Activity于View的结合

2013-11-15 16:35 561 查看
在以往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);


<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);
}


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;
...
}
而我们在ActivityState中发现了setContentPane的调用身影:

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);


private final GLView mRootPane = new GLView() {


因此总结Activity与View的结合如下:

Gallery对应于GLRootView这个对象,而GLRootView有很大的灵活性,它在Gallery细分为不同的ActivityState时实际渲染ActivityState中新建的GLView对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: