カスタムダイアログをアニメーション化する


97

テキストビューからスライドダウンしているように見えるカスタムダイアログを表示しようとしています。これは可能ですか?ダイアログクラスにアニメーションを適用できないようです。私はコンストラクタでこの行を試しましたが、効果はありません:

this.getWindow()。setWindowAnimations(R.anim.paranimation);

アニメーションが正しいかどうかさえわかりませんが、アニメーションが何をしているのかがわかれば調整できます。完全を期すために、以下にリストします。私は実際のアニメーションについてのヘルプを探しているのではなく、ダイアログへのアプリケーションを探しています。

paranimation.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-200%"
    android:toXDelta="0%"
    android:fromYDelta="200%"
    android:toYDelta="0%"
    android:duration="3000"
    android:zAdjustment="top">
</translate>

4
これも知っておく必要があります。これ以外に、ほとんど何でもアニメートすることが可能のようです。それとも私は間違っていますか?
andy_spoo

回答:


214

今日はダイアログアニメーションと格闘していましたが、ようやくスタイルを使用して機能するようになりました。ここに例を示します。

まず、最も重要なこと—今日は5つの異なる方法で機能していた可能性がありますが、デバイスのアニメーション設定が「アニメーションなし」に設定されている場合(設定→表示→アニメーション)、ダイアログは表示されません。あなたが何をしてもアニメにならないでください!

以下は、私のstyles.xmlを取り除いたバージョンです。うまくいけば、それは自明です。これはにありres/valuesます。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="PauseDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowAnimationStyle">@style/PauseDialogAnimation</item>
    </style>

    <style name="PauseDialogAnimation">
        <item name="android:windowEnterAnimation">@anim/spin_in</item>
        <item name="android:windowExitAnimation">@android:anim/slide_out_right</item>
    </style>
</resources>

windowEnterAnimation私のアニメーションの一つであり、中に位置していますres\animwindowExitAnimationAndroidのSDKの一部であり、アニメーションの一つです。

次に、アクティビティonCreateDialog(int id)メソッドでダイアログを作成すると、次のようになります。

Dialog dialog = new Dialog(this, R.style.PauseDialog);

// Setting the title and layout for the dialog
dialog.setTitle(R.string.pause_menu_label);
dialog.setContentView(R.layout.pause_menu);

または、テーマを受け取るDialogコンストラクタを使用する代わりに、次の方法でアニメーションを設定することもできます。

Dialog dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;

2
これは、この例のために作成した名前であり、実際にそのアニメーションを作成したことはありません。
ChrisJD、2011年

2
この回答を本当にありがとう、それは本当に不十分に文書化されていますが、Android Developersグループからの手掛かりを介してこの投稿を見つけました。
David Snabel-Caunt

3
+1「デバイスのアニメーション設定が「アニメーションなし」に設定されている場合(設定→表示→アニメーション)の場合、ダイアログは何をしてもアニメーションになりません!」。確認するのを忘れていました。
Vincent Mimoun-Prat 2013

Dialog dialog = new Dialog(this, R.style.PauseDialog);API 11用ですが、これは一般的なものですDialog dialog = new Dialog(Context context);
メフメット2014年

2
私がこれで直面している問題は、ダイアログが表示されているときにアプリを最小化し、再びアプリを復元すると、ダイアログが再びアニメーション化し、それを回避する方法、完璧を保つことです。+1
2016年

56

ChrisJDコードを使用して、Dialogboxのフェードインおよびフェードアウトアニメーションを作成しました。

  1. res / style.xml内

    <style name="AppTheme" parent="android:Theme.Light" />
    <style name="PauseDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowAnimationStyle">@style/PauseDialogAnimation</item>
    </style>
    
    <style name="PauseDialogAnimation">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>
    

  2. anim / fadein.xml内

    <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" />
    
  3. anim / fadeout.xml内

    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/anticipate_interpolator"
        android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />
    
  4. 主な活動

    Dialog imageDiaglog= new Dialog(MainActivity.this,R.style.PauseDialog);

11
デフォルトのAndroidフェードアニメーション '@android:anim / fade_in' '@android:anim / fade_out'を使用できます
Marek

19

右から左(エントリーアニメーション)および左から右(終了アニメーション):

styles.xml:

<style name="CustomDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/CustomDialogAnimation</item>
</style>

<style name="CustomDialogAnimation">
    <item name="android:windowEnterAnimation">@anim/translate_left_side</item>
    <item name="android:windowExitAnimation">@anim/translate_right_side</item>
</style>

res / anim /に2つのファイルを作成します。

translate_right_side.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0%" android:toXDelta="100%"
    android:fromYDelta="0%" android:toYDelta="0%"
    android:duration="600"/>

translate_left_side.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fromXDelta="100%"
    android:toXDelta="0%"/>

あなたのフラグメント/アクティビティ:

Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog);

13

私は同じ問題に会いますが、ついに私は次の方法で問題を解決します

((ViewGroup)dialog.getWindow().getDecorView())
.getChildAt(0).startAnimation(AnimationUtils.loadAnimation(
context,android.R.anim.slide_in_left));

4
賢明な答えではありません。ダイアログ内のビューはアニメーション化されます
DJphy

12

まず、res / anim dirに2つのアニメーションリソースを作成する必要があります。

slide_up.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:duration="@android:integer/config_mediumAnimTime"
    android:fromYDelta="100%"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toXDelta="0">
</translate>
</set>

slide_bottom.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate 
    android:duration="@android:integer/config_mediumAnimTime" 
    android:fromYDelta="0%p" 
    android:interpolator="@android:anim/accelerate_interpolator" 
    android:toYDelta="100%p">
</translate>
</set>

次に、スタイルを作成する必要があります

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_bottom</item>
</style>

この行をクラスに追加します

dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id

http://www.devexchanges.info/2015/10/showing-dialog-with-animation-in-android.htmlに基づいています


参考URLが便利!
ahmednabil88

2

以下のコードを試してください:

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// set transparent in window background

        View _v = inflater.inflate(R.layout.some_you_layout, container, false);

        //load animation
        //Animation transition_in_view = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in);// system animation appearance
        Animation transition_in_view = AnimationUtils.loadAnimation(getContext(), R.anim.customer_anim);//customer animation appearance

        _v.setAnimation( transition_in_view );
        _v.startAnimation( transition_in_view );
        //really beautiful
        return _v;

    }

カスタムAnimを作成します。res/ anim / customer_anim.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="500"
        android:fromYDelta="100%"
        android:toYDelta="-7%"/>
    <translate
        android:duration="300"
        android:startOffset="500"
        android:toYDelta="7%" />
    <translate
        android:duration="200"
        android:startOffset="800"
        android:toYDelta="0%" />

</set>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.