2012年6月16日土曜日

半透明Activityのフェードイン・フェードアウト

Activityを半透明にする方法と、Activityのアニメーションを適用する方法、どちらか片方には出来ても、両方実現する方法はなかなか載ってなくて苦労したので書いておきます。


まずは半透明化

これは調べればすぐできるとは思いますが、
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="translucent_background">#88000000</drawable>
    <style name="Style.translucent" parent="android:style/Theme.Translucent">
        <item name="android:windowBackground">@drawable/translucent_background</item>
    </style>
</resources>
こんな感じのを作って、ManifestでActivityのThemeに設定するだけです。

アニメーションはThemeにはしない

いろいろ検索してみた結果、Activtyにアニメーションをつけるとき、
    <style name="Style.Alpha" parent="android:Animation.Activity">
        <item name="android:activityOpenEnterAnimation">@anim/activity_fadein</item>
        <item name="android:activityOpenExitAnimation">@anim/activity_fadeout</item>
        <item name="android:activityCloseEnterAnimation">@anim/activity_fadein</item>
        <item name="android:activityCloseExitAnimation">@anim/activity_fadeout</item>
    </style>
こんな感じのを作ってThemeに設定するのが主流のようですが、上記ではなくまた別の方法を使います。

とりあえずはanimationの作成です。今回はフェードイン・アウトで。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        android:duration="700"
        android:fillAfter="true"
        android:fillEnabled="true"/>
</set>
フェードアウトはコレのfromAlphaとtoAlphaの値を入れ替えたものをもう一つ作成。

そして、アニメーションさせたいActivityのコードに少し付け足します。
- package, import部省略 -
public class Activity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        overridePendingTransition(R.anim.activity_fadein, R.anim.activity_fadeout);
    }
    
    @Override
    public void onPause() {
     super.onPause();
        overridePendingTransition(R.anim.activity_fadein, R.anim.activity_fadeout);
    }
}
注目するのは7行目と13行目です。
overridePendingTransition に、先ほど作成したAnimationを指定しています。

onCreateの時に実行すると、フェードイン(第一引数)のアニメーションが実際に動き、
onPauseの時に実行すると、フェードアウト(第二引数)のアニメーションが実際に動くようです。

つまり、7行目の「R.anim.activity_fadeout」と、
13行目の「R.anim.activity_fadein」はおそらく意味がありません(笑)
なので、それぞれ「0」でも結構です(未検証)。

おわりに

もしかしたらThemeで半透明とアニメーションを両立させる方法があるのかもしれません。
知ってる方は教えてくれるとうれしいです。

0 件のコメント:

コメントを投稿

Amazon