▼Androidメモ▼
アクティビティ遷移時のアニメーション


アクティビティ遷移時のアニメーションを利用するプログラムを作成する。
「設定→画面設定→アニメーション表示」で「すべてのアニメーション」を選択しておく必要あり。


リソース
「res/drawable-nodpi」に「pic0.jpg」を配置。

「res/drawable-nodpi」に「pic1.jpg」を配置。



「res/anim」に「activity_open_enter.xml」を配置。
アクティビティ起動時の開く側のアニメーション。
activity_open_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator">
    <translate 
        android:fromYDelta="100%" 
        android:toYDelta="0%"
        android:duration="500" 
        android:fillAfter="true"  
        android:fillEnabled="true"/>
</set>
「res/anim」に「activity_open_exit.xml」を配置。
アクティビティ起動時の閉じる側のアニメーション。
activity_open_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator">
    <translate 
        android:fromYDelta="0%" 
        android:toYDelta="-100%"
        android:duration="500"
        android:fillAfter="true"  
        android:fillEnabled="true"/>
</set>
「res/anim」に「activity_close_enter.xml」を配置。
アクティビティ終了時の開く側のアニメーション。
activity_close_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator">
    <translate 
        android:fromYDelta="-100%" 
        android:toYDelta="0%"
        android:duration="500"
        android:fillAfter="true"  
        android:fillEnabled="true"/>
</set>
「res/anim」に「activity_close_enter.xml」を配置。
アクティビティ終了時の閉じる側のアニメーション。
activity_close_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator">
    <translate 
        android:fromYDelta="0%" 
        android:toYDelta="100%"
        android:duration="500"
        android:fillAfter="true"  
        android:fillEnabled="true"/>
</set>


ソースコード
TransitionEx0.java
package net.npaka.transitionex; 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.LinearLayout;

//トランジション0
public class TransitionEx0 extends Activity
    implements View.OnClickListener {
    private final static int WC=LinearLayout.LayoutParams.WRAP_CONTENT;

    //アプリの初期化
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
       
        //レイアウトの生成
        LinearLayout layout=new LinearLayout(this);
        layout.setBackgroundResource(R.drawable.pic0);
        setContentView(layout);
        
        //ボタンの生成
        Button button=new Button(this);
        button.setText("アクティビティの遷移");
        button.setOnClickListener(this);
        button.setLayoutParams(new LinearLayout.LayoutParams(WC,WC));
        layout.addView(button);
    }

    //ボタンクリック時に呼ばれる
    public void onClick(View view) {
        Intent intent=new Intent(this,TransitionEx1.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        
        //startActivity()またはfinish()の後で遷移アニメ指定
        overridePendingTransition(
            R.anim.activity_open_enter,
            R.anim.activity_open_exit);
    }
}

TransitionEx1.java
package net.npaka.transitionex; 
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.LinearLayout;

//トランジション1
public class TransitionEx1 extends Activity
    implements View.OnClickListener {
    private final static int WC=LinearLayout.LayoutParams.WRAP_CONTENT;

    //アプリの初期化
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
       
        //レイアウトの生成
        LinearLayout layout=new LinearLayout(this);
        layout.setBackgroundResource(R.drawable.pic1);
        setContentView(layout);
        
        //ボタンの生成
        Button button=new Button(this);
        button.setText("アクティビティの終了");
        button.setOnClickListener(this);
        button.setLayoutParams(new LinearLayout.LayoutParams(WC,WC));
        layout.addView(button);
    }

    //ボタンクリック時に呼ばれる
    public void onClick(View view) {
        finish();

        //startActivity()またはfinish()の後で遷移アニメ指定
        overridePendingTransition(
            R.anim.activity_close_enter,
            R.anim.activity_close_exit);
    }
    
    //キー押下時に呼ばれる
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction()==KeyEvent.ACTION_DOWN &&
            event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
            finish();
                    
            //startActivity()またはfinish()の後で遷移アニメ指定
            overridePendingTransition(
                R.anim.activity_close_enter,
                R.anim.activity_close_exit);
            return true;
        }
        return super.dispatchKeyEvent(event);
    }

}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.npaka.transitionex"
    android:versionCode="1"
    android:versionName="1.0">
    <application 
        android:icon="@drawable/icon" 
        android:label="@string/app_name">
        <activity 
            android:name=".TransitionEx0"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity 
            android:name=".TransitionEx1"
            android:label="@string/app_name">
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="7" />
</manifest> 


テーマによる指定
遷移アニメの変更が必要ない時は、overridePendingTransition()の代わりにテーマで指定することも可能。

「res/values」に「styles.xml」を配置。
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Animation.Activity" parent="android:Animation">
        <item name="android:activityOpenEnterAnimation">@anim/activity_open_enter</item>
        <item name="android:activityOpenExitAnimation">@anim/activity_open_exit</item>
        <item name="android:activityCloseEnterAnimation">@anim/activity_close_enter</item>
        <item name="android:activityCloseExitAnimation">@anim/activity_close_exit</item>
    </style>
<style name="MyTheme" parent="android:Theme"> <item name="android:windowAnimationStyle">@style/Animation.Activity</item> </style> </resources>

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.npaka.transitionex"
    android:versionCode="1"
    android:versionName="1.0">
    <application 
        android:icon="@drawable/icon" 
        android:label="@string/app_name">
        <activity 
            android:name=".TransitionEx0"
            android:label="@string/app_name"
            android:theme="@style/MyTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity 
            android:name=".TransitionEx1"
            android:label="@string/app_name"
            android:theme="@style/MyTheme">
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="7" />
</manifest> 


−戻る−