タブ内のActivity遷移で3Dアニメーション

1年以上前に紹介された3Dアニメーションの Activity画面切り替えを
タブ画面内(TabHost)で Activity を切り替えるケースに適用してみた。

http://blog.robert-heim.de/karriere/android-startactivity-rotate-3d-animation-activityswitcher/

  で紹介されたプログラムの利用である。

1つのタブ内での Activity の遷移なので、ActivityGroup を使用する中での
紹介されたアニメーションのプログラムを実行する。

例 サンプル、、)

TabHost に、ActivityGroup 継承して作ったものを TabSpec コンテンツとして登録

TabActivity onCreate で、

TabHost host = getTabHost();

TabSpec tab2 = host.newTabSpec("Tab2");
tab2.setIndicator("second", getResources().getDrawable(android.R.drawable.ic_menu_add));
// ActivityGroup 継承 → Group2Activity
tab2.setContent(new Intent(this, Group2Activity.class));
host.addTab(tab2);

Group2Activity では、アニメーションのプログラム実行を書かない!
しかし、Intent 生成で Intent.FLAG_ACTIVITY_NO_ANIMATION を指定する。

import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
/**
 * Group1Activity
 */

public class Group2Activity extends ActivityGroup{
   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      showChild21();   // 初期表示
   }
   public void showChild21(){
      Intent intent = new Intent(this, Child21Activity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
      Window window = getLocalActivityManager().startActivity("child21",intent);
      setContentView(window.getDecorView());

   }
   public void showChild22(){
      Intent intent = new Intent(this, Child22Activity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
      Window window = getLocalActivityManager().startActivity("child22",intent);
      setContentView(window.getDecorView());

   }
}

Child21Activity の onResume() で、画面に出現表示時のアニメーションを実行
  → ActivitySwitcher.animationIn の実行
画面内のボタンを押して、Child22Activity にアクティビティが切り替わるものとして、、
  → ActivitySwitcher.animationOut の実行で、リスナで上の ActivityGroup 
メソッドを実行する。

つまり、TabActivity から見て ActivityGroup 管理下の表示でアニメーションを実行する。

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Child21Activity
 */

public class Child21Activity extends Activity{

   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setContentView(R.layout.child21);

      *1.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            // アニメーションを実行
            // R.id.container は、以下、R.layout.child21 の XML を参照
            ActivitySwitcher.animationOut(findViewById(R.id.container), getWindowManager()
            ,new ActivitySwitcher.AnimationFinishedListener(){
               @Override
               public void onAnimationFinished() {

                  // ActivityGroup で切り替え実行
                  *2;

      super.onResume();
   }
}

R.layout.child21 の内容

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#ffffff" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        android:text="Child 21"
        android:textColor="#000000"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    <Button
        android:id="@+id/changeButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="40dp"
        android:text="to Child 22" />
</LinearLayout>

*1:Button)findViewById(R.id.changeButton

*2:Group2Activity)getParent()).showChild22();
               }
            });

         }
      });
   }
   @Override
   protected void onResume(){
      ActivitySwitcher.animationIn(findViewById(R.id.container), getWindowManager(