web-dev-qa-db-ja.com

DialogFragmentの入力/終了遷移を閉じる直前に変更します

私はDialogFragmentを持っており、onActivityCreatedメソッドで以下のように入/出口のアニメーションを設定します

  @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow()
                .getAttributes().windowAnimations = R.style.DialogAnimation;
    }

私のDialogAnimationスタイルファイルは次のとおりです

<style name="DialogAnimation">
        <item name="Android:windowEnterAnimation">@Android:anim/fade_in</item>
        <item name="Android:windowExitAnimation">@Android:anim/fade_out</item>
    </style>

これは今私のために働く...

私の問題は、OKボタンがクリックされたときとキャンセルボタン用の2つの異なる終了アニメーションを持ちたいと思うことです。それを達成する方法について...これは私が試したことです。

  @Override
    public void onClick(View v) {
        getDialog().getWindow()
                .getAttributes().windowAnimations = R.style.DialogAnimation2;
        this.dismiss();
    }
35
Dominic D'Souza

変更することなく、DialogFragment内で実行できます。

getDialog().getWindow()
            .getAttributes().windowAnimations

OnStartおよびonClickで「装飾ビュー」をアニメートする必要があります。

これは抜粋されたコードです:

最初にダイアログを作成

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setTitle("Hello from animated dialog :)")
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                //we have to add button here and then override it's click in onStart
                            }
                        }
                )
                .setCancelable(false)
                .create();
    }

次に、onStartメソッドをオーバーライドします

@Override
    public void onStart() {
        super.onStart();

        AlertDialog dialog = (AlertDialog)getDialog();

        final View decorView = getDialog()
                .getWindow()
                .getDecorView();

        ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView,
                PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f),
                PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f),
                PropertyValuesHolder.ofFloat("alpha", 0.0f, 1.0f));
        scaleDown.setDuration(2000);
        scaleDown.start();


        Button positiveButton = dialog.getButton(Dialog.BUTTON_NEGATIVE);
        positiveButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                final View decorView = getDialog()
                        .getWindow()
                        .getDecorView();

                ObjectAnimator scaleDown = ObjectAnimator.ofPropertyValuesHolder(decorView,
                        PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
                        PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
                        PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f));
                scaleDown.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        dismiss();
                    }

                    @Override
                    public void onAnimationStart(Animator animation) {
                    }
                    @Override
                    public void onAnimationCancel(Animator animation) {
                    }
                    @Override
                    public void onAnimationRepeat(Animator animation) {
                    }
                });
                scaleDown.setDuration(2000);
                scaleDown.start();
            }
        });
    }

ここに結果のアニメーションがあります

Demo of the result


また、コードからスケールプロパティを削除すると、アルファアニメーションのみが取得されます。まさにあなたが望んでいた。

これを削除します:

PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
48
Danylo Volokh

ダイアログフラグメントのアップおよびダウンアニメーションを設定できます。 「res/anim」に2つのファイルを追加します。

//スライドアップアニメーション

<?xml version="1.0" encoding="utf-8"?>
<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:toYDelta="0" />

</set>

//スライドdowmアニメーション

<?xml version="1.0" encoding="utf-8"?>
<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" />

</set>

// スタイル

<style name="DialogAnimation">
    <item name="Android:windowEnterAnimation">@anim/slide_up</item>
    <item name="Android:windowExitAnimation">@anim/slide_down</item>
</style>

// Inside Dialog Fragment

@Override
public void onActivityCreated(Bundle arg0) {
    super.onActivityCreated(arg0);
    getDialog().getWindow()
   .getAttributes().windowAnimations = R.style.DialogAnimation;
}
22
Akhil Jayakumar

最善のアプローチは、ボタンクリックでさまざまなアニメーションを呼び出すことだと思います。したがって、次のようなものがあります。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button OkButton = (Button) findViewById(R.id.btnOk);
        Button CancelButton = (Button) findViewById(R.id.btnCancel);

        OkButton.setOnClickListener(new OnClickListener() {

            @Override    
            public void onClick(View view) {
                    getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;    
            }
        });
        return true;

        CancelButton.setOnClickListener(new OnClickListener() {

            @Override    
            public void onClick(View view) {
                getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation2;    
            }
        });
        return true;
    }

私があなただったら、将来の参考のために正しい命名規則も使用するでしょう。たとえば、DialogAnimationをOkAnimationに設定し、DialogAnimation2をCancelAnimationに設定します。

これが役立つホーム:)

3

必要なことを行う簡単な方法の1つは、アニメーションリスナーを使用することです。

    animation.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub
            // dismiss your dialog in here and it will work
        }
    });

Onclickメソッドでアニメーションを開始し、onAnimationEnd()メソッドでダイアログを閉じます。Snimationオブジェクトを作成し、ViewのstartAnimation(animation)メソッドで手動で開始する必要がある場合があります。

2
Arslan

基本ダイアログのテーマを設定する必要があります

言ってみましょう:-

public class CustomDialogFragment extends DialogFragment implements OnEditorActionListener
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    {
        // Set a theme on the dialog builder constructor!
        AlertDialog.Builder builder = 
            new AlertDialog.Builder( getActivity(), R.style.MyCustomTheme );

        builder  
        .setTitle( "Your title" )
        .setMessage( "Your message" )
        .setPositiveButton( "OK" , new DialogInterface.OnClickListener() 
            {      
              @Override
              public void onClick(DialogInterface dialog, int which) {
              dismiss();                  
            }
        });
        return builder.create();
    }
}

次に、目的のアニメーションを含むテーマを定義する必要があります。 styles.xmlで、カスタムテーマを追加します。

<style name="MyCustomTheme" parent="@Android:style/Theme.Panel">
    <item name="Android:windowAnimationStyle">@style/MyAnimation.Window</item>
</style>

<style name="MyAnimation.Window" parent="@Android:style/Animation.Activity"> 
    <item name="Android:windowEnterAnimation">@anim/anim_in</item>
    <item name="Android:windowExitAnimation">@anim/anim_out</item>
</style> 

参照 this

0
Praveen Sharma