私は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();
}
変更することなく、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();
}
});
}
ここに結果のアニメーションがあります
また、コードからスケールプロパティを削除すると、アルファアニメーションのみが取得されます。まさにあなたが望んでいた。
これを削除します:
PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
ダイアログフラグメントのアップおよびダウンアニメーションを設定できます。 「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;
}
最善のアプローチは、ボタンクリックでさまざまなアニメーションを呼び出すことだと思います。したがって、次のようなものがあります。
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に設定します。
これが役立つホーム:)
必要なことを行う簡単な方法の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)メソッドで手動で開始する必要がある場合があります。
基本ダイアログのテーマを設定する必要があります
言ってみましょう:-
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