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

在以往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。

  1.  protected void onCreate(Bundle savedInstanceState) {  
  2. ...  
  3.         setContentView(R.layout.main);
    protected void onCreate(Bundle savedInstanceState) {
...
        setContentView(R.layout.main);

  1. <merge xmlns:android="http://schemas.android.com/apk/res/android">  
  2.     <com.android.gallery3d.ui.GLRootView  
  3.             android:id="@+id/gl_root_view"  
  4.             android:layout_width="match_parent"  
  5.             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()中完成,在这里我们发现了:

  1. if (mContentView != null) {  
  2.            //added for stereo display feature   
  3.            transformForStereo();  
  4.   
  5.            mContentView.render(mCanvas);  
  6.         } 
        if (mContentView != null) {
           //added for stereo display feature
           transformForStereo();

           mContentView.render(mCanvas);
        } 

render是渲染函数,即把mContentView的内容在屏幕上画出来。这说明GLSurfaceView的内容完全由mContentView决定。那么这个mContentView是什么呢?

它是GLView类型的成员,在GLRootView.java中搜索这个成员变量,寻找它实例化的地方:

  1. public void setContentPane(GLView content) {  
  2.         if (mContentView == content) return;  
  3.         if (mContentView != null) {  
  4. ...  
  5.             mContentView.detachFromRoot();  
  6.             BasicTexture.yieldAllTextures();  
  7.         }  
  8.         mContentView = content;  
  9. ...  
  10.     }
    public void setContentPane(GLView content) {
        if (mContentView == content) return;
        if (mContentView != null) {
...
            mContentView.detachFromRoot();
            BasicTexture.yieldAllTextures();
        }
        mContentView = content;
...
    }
而我们在ActivityState中发现了setContentPane的调用身影:

  1. protected void setContentPane(GLView content) {  
  2.         mContentPane = content;  
  3. ...  
  4.         mContentPane.setBackgroundColor(getBackgroundColor());  
  5.         mActivity.getGLRoot().setContentPane(mContentPane);//对GLRootView中该函数的调用   
  6.     }
    protected void setContentPane(GLView content) {
        mContentPane = content;
...
        mContentPane.setBackgroundColor(getBackgroundColor());
        mActivity.getGLRoot().setContentPane(mContentPane);//对GLRootView中该函数的调用
    }

在AlbumSetPage的onResume中我们知道了这个mContentPane的庐山真面目:

  1.  public void onResume() {  
  2.         super.onResume();  
  3.         mIsActive = true;  
  4.         setContentPane(mRootPane);
    public void onResume() {
        super.onResume();
        mIsActive = true;
        setContentPane(mRootPane);

  1.  private final GLView mRootPane = new GLView() {</SPAN>  
    private final GLView mRootPane = new GLView() {

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

Gallery对应于GLRootView这个对象,而GLRootView有很大的灵活性,它在Gallery细分为不同的ActivityState时实际渲染ActivityState中新建的GLView对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值