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>