Android 1.5以降の2つのアクティビティ間の移行を定義する方法を教えてください。フェードインするアクティビティをお願いします。
これは Activity.overridePendingTransition()
で行えます。単純な遷移アニメーションをXMLリソースファイルに定義できます。
これは、2つのアクティビティ間でスムーズにフェードアウトするためのコードです。
fadein.xml
にres/anim
というファイルを作成します。
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="2000" />
fadeout.xml
にres/anim
というファイルを作成します。
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="2000" />
Activity AからActivity Bにフェードインする場合は、Activity BのonCreate()
メソッドに次のように入力します。 setContentView()
が私のために働く前に。
overridePendingTransition(R.anim.fadein, R.anim.fadeout);
フェードが遅すぎる場合は、上記のxmlファイルのAndroid:duration
をもっと小さいものに変更してください。
それを行うさらに簡単な方法は、次のとおりです。
<style name="WindowAnimationTransition"> <item name="Android:windowEnterAnimation">@Android:anim/fade_in</item> <item name="Android:windowExitAnimation">@Android:anim/fade_out</item> </style>
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar"> <item name="Android:windowAnimationStyle">@style/WindowAnimationTransition</item> </style>
それでおしまい :)
はい。あなたはあなたの活動のためにどのような移行をしたいのかをOSに伝えることができます。
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getWindow().setWindowAnimations(ANIMATION);
...
}
ここで、ANIMATIONはOSの組み込みアニメーションを指す整数です。
デフォルトのアニメーションのリストについては、次を参照してください。 http://developer.Android.com/reference/Android/R.anim.html
実際には、APIレベル1以上ではfade_in
とfade_out
があります。
res> anim> fadein.xmlを作成します。
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:fromAlpha="0.0" Android:toAlpha="1.0" Android:duration="500" />
res> anim> fadeout.xmlを作成します。
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:fromAlpha="1.0" Android:toAlpha="0.0" Android:duration="500" />
Res> values> styles.xml内
<style name="Fade">
<item name="Android:windowEnterAnimation">@anim/fadein</item>
<item name="Android:windowExitAnimation">@anim/fadeout</item>
</style>
CreateCreate()のアクティビティ中
getWindow().getAttributes().windowAnimations = R.style.Fade;
これは、2つのアクティビティの間をスムーズにするコードです。
左から右への滑らかな効果
Res/animにslide_in_right.xmlおよびslide_out_right.xmlというファイルを作成します。
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false" >
<translate Android:duration="5000" Android:fromXDelta="100%" Android:toXDelta="0%" />
<alpha Android:duration="5000" Android:fromAlpha="0.0" Android:toAlpha="1.0" />
</set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false" >
<translate Android:duration="5000" Android:fromXDelta="0%" Android:toXDelta="-100%"/>
<alpha Android:duration="5000" Android:fromAlpha="1.0" Android:toAlpha="0.0" />
</set>
右から左への滑らかな効果
Res/animにanimation_enter.xmlおよびanimation_leave.xmlというファイルを作成します。
animation_enter.xml
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate Android:fromXDelta="-100%" Android:toXDelta="0%"
Android:fromYDelta="0%" Android:toYDelta="0%"
Android:duration="700"/>
</set>
animation_leave.xml
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false">
<translate
Android:fromXDelta="0%" Android:toXDelta="100%"
Android:fromYDelta="0%" Android:toYDelta="0%"
Android:duration="700" />
</set>
あるアクティビティから別のアクティビティに移動する
Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
startActivity(intent_next);
finish();
4.バックプレスイベントまたは2番目のアクティビティから1つのアクティビティへのナビゲート
Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
startActivity(home_intent);
finish();
デフォルトのアクティビティアニメーションを上書きします。私はそれがスムーズに動作することをapi 15でテストしています。これが私が使う解決策です:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorPrimary</item>
<item name="Android:windowAnimationStyle">@style/CustomActivityAnimation</item>
</style>
<style name="CustomActivityAnimation" parent="@Android:style/Animation.Activity">
<item name="Android:activityOpenEnterAnimation">@anim/slide_in_right</item>
<item name="Android:activityOpenExitAnimation">@anim/slide_out_left</item>
<item name="Android:activityCloseEnterAnimation">@anim/slide_in_left</item>
<item name="Android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>
Resフォルダの下にanimフォルダを作成してから、次の4つのアニメーションファイルを作成します。
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromXDelta="100%p" Android:toXDelta="0"
Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromXDelta="0" Android:toXDelta="-100%p"
Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromXDelta="-100%p" Android:toXDelta="0"
Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
<translate Android:fromXDelta="0" Android:toXDelta="100%p"
Android:duration="@Android:integer/config_mediumAnimTime"/>
</set>
私の サンプルプロジェクト をダウンロードできます。
それで全部です... :)
Android 1.5ではoverridePendingTransitionを使用できません。 overridePendingTransistionはAndroid 2.0になりました。
エラーなしでこの問題を解決するには、通常のアニメーションを使用して(1.5以上)ターゲット用にコンパイルするか、overridePendingTransistionを使用してターゲット用(2.0以上)にコンパイルする必要があります。
概要:Android 1.5ではoverridePendingTransistionを使用できません。
あなたはしかし、OSの内蔵アニメーションを使用することができます。
GALAXY機器の場合:
設定>開発者向けオプションを使用して、デバイスの電源を切っていないことを確認する必要があります。
あなたの意図を始める前に:
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());
これはあなたの活動移行にデフォルトのアニメーションを与えます。
ActivityCompat.startActivity()を使用すると、API> 21で動作します。
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
ActivityCompat.startActivity(activity, intent, options.toBundle());
AndroidのいくつかのバージョンはカスタムActivity
トランジションをサポートし、いくつかはサポートしません(古いデバイス)。カスタムトランジションを使用したい場合は、Activity
にoverridePendingTransition()
メソッドがあるかどうかを確認することをお勧めします。古いバージョンではそうではありません。
メソッドが存在するかどうかを知るには、リフレクションAPIを使用できます。これが存在する場合、メソッドをチェックして返す単純なコードです。
Method mOverridePendingTransition;
try {
mOverridePendingTransition = Activity.class.getMethod(
"overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
/* success */
} catch (NoSuchMethodException nsme) {
/* failure, this version of Android doesn't have this method */
}
そして、私たちは自分自身のトランジションを適用することができます。
if (UIConstants.mOverridePendingTransition != null) {
try {
UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
ここでは、例として、単純なフェードインアニメーションとフェードアウトアニメーションをトランジションのデモに使用しました。
アニメーションをズームインする
Intent i = new Intent(getApplicationContext(), LoginActivity.class);
overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();
zoom_enter
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:fromAlpha="0.0" Android:toAlpha="1.0"
Android:duration="500" />
zoom_exit
<alpha xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:interpolator="@Android:anim/accelerate_interpolator"
Android:fromAlpha="1.0" Android:toAlpha="0.0"
Android:fillAfter="true"
Android:duration="500" />