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);
[html] view plain copy print ?
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); }
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;
... }
[java] view plain copy print ?
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);
[java] view plain copy print ?
private final GLView mRootPane = new GLView() {
そこで、ActivityとViewの組み合わせをまとめると、以下のようになります.
GalleryはGLRootViewというオブジェクトに対応していますが、GLRootViewは、Galleryが異なるActivity Stateに細分化されたときにActivity Stateで新しく作成されたGLViewオブジェクトを実際にレンダリングする柔軟性があります.
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_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) {
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 != null) {
mContentView.detachFromRoot();
}
...
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) {
...
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() {
mIsActive = true;
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オブジェクトを実際にレンダリングする柔軟性があります.