Android4.2.2 Gallery 2ソースコード分析(10)——ActivityのViewへの結合

4874 ワード

従来のActivityでは、ほとんどがViewを記述しており、最後にActivityのonCreate()関数でsetContentView(new MyView()を呼び出すだけで対応するビューをActivityに貼り付けることができます.GalleryではActivity StateがActivityに代わった.GLViewがViewに代わったが、この2つはどのように結合したのだろうか.
ActivityがActivityに取って代わったとはいえ、AndroidシステムはActivityしか認識せず、最終的に画面に現れたのはActivityであり、このActivityの下でより小さなActivity Stateを細分化してActivityの動作をシミュレートしただけだ.だからプログラムの総入口認識はActivityから始まり、これがGalleryである.JAvaのonCreate()関数、Gallery.JAvaはActivityから継承されます.
[java] view plain copy print ?
 protected void onCreate(Bundle savedInstanceState) {  
  • ...  

  •         setContentView(R.layout.main);
        protected void onCreate(Bundle savedInstanceState) {
    ...
            setContentView(R.layout.main);

    [html] view plain copy print ?
      
  •     
                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()で完了しています.ここで発見しました.
    [java] view plain copy print ?
    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でこのメンバー変数を検索し、インスタンス化された場所を探します.
    [java] view plain copy print ?
    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;
    ...
        }
    Activity StateでsetContentPaneの呼び出しの姿を発見しました.
    [java] view plain copy print ?
    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の廬山の正体を知っています.
    [java] view plain copy print ?
     public void onResume() {  
  •         super.onResume();  

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

    [java] view plain copy print ?
     private final GLView mRootPane = new GLView() {  
        private final GLView mRootPane = new GLView() {

    そこで、ActivityとViewの組み合わせをまとめると、以下のようになります.
    GalleryはGLRootViewというオブジェクトに対応していますが、GLRootViewは、Galleryが異なるActivity Stateに細分化されたときにActivity Stateで新しく作成されたGLViewオブジェクトを実際にレンダリングする柔軟性があります.