Android 在点击外部时向DialogFragment的关闭添加动画
我是Android开发新手(来自Swift/iOS)。当我点击视图外部时,我试图在关闭对话框片段时添加一些动画。我已经阅读了很多关于对话动画的帖子,并找到了一些帮助我的解决方案走到这一步的帖子 工作原理:Android 在点击外部时向DialogFragment的关闭添加动画,android,android-dialogfragment,Android,Android Dialogfragment,我是Android开发新手(来自Swift/iOS)。当我点击视图外部时,我试图在关闭对话框片段时添加一些动画。我已经阅读了很多关于对话动画的帖子,并找到了一些帮助我的解决方案走到这一步的帖子 工作原理: 在警报中可以很好地放大和淡出(启动时onStart()正在工作) 当按下“关闭”按钮时,警报会很好地缩小并淡出 点击(点击onClick()正在工作) 什么不起作用: 在警报之外点击。它关闭警报,但不显示优美的动画 从技术上讲,这是为了: DialogFragment 使用AlertD
- 在警报中可以很好地放大和淡出(启动时
正在工作)onStart()
- 当按下“关闭”按钮时,警报会很好地缩小并淡出
点击(点击
正在工作)onClick()
- 在警报之外点击。它关闭警报,但不显示优美的动画
DialogFragment
AlertDialog.Builder
属性在生成器上设置为true
警报对话框
上,将设置取消对外部接触
属性设置为trueObjectAnimator
OnCancelListener
。然而,在运行时我收到一个错误,基本上是
注意:DialogFragment拥有Dialog.setOnCancelListener和Dialog.setOnDismissListener回调。你不能自己设置它们。要了解这些事件,请重写onCancel(DialogInterface)和onDismiss(DialogInterface)
嗯。很简单,我想我会覆盖OnCancel
是的,但当我点击警报对话框片段外部时,动画确实会出现。它仍然取消(关闭)-只是没有动画。调试时,我看到它进入了我的代码中,但一旦我输入重写的onCancel()
方法,警报就已经关闭/隐藏/取消。看来我在生命周期中已经太晚了。由于我无法为对话框片段
覆盖OnCancelListener
,我想知道是否有人能解决或洞察我的困境
长与短:
我希望能够有相同的动画,我有点击对话框的关闭按钮,因为我做时,点击外面的警报
以下是我的代码片段:
public void onStart() {
super.onStart();
AlertDialog dialog = (AlertDialog)getDialog();
ObjectAnimator scaleUp = scaleUp(dialog);
scaleUp.start();
Button closeButton = dialog.getButton(Dialog.BUTTON_NEGATIVE);
closeButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
AlertDialog dialog = (AlertDialog)getDialog();
ObjectAnimator scaleDown = scaleDown(dialog);
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.start();
}
});
}
以下是onCancel覆盖:
@Override
public void onCancel(final DialogInterface dialog) {
ObjectAnimator scaleDown = scaleDown((AlertDialog)dialog);
scaleDown.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationEnd(Animator animation) {
Log.i("DialogFragment","onAnimationEnd");
dialog.dismiss();
}
@Override
public void onAnimationStart(Animator animation) {
Log.i("DialogFragment","onAnimationStart");
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
scaleDown.start();
}
这两种方法scaleUp
和scaleDown
只是重构的,它们只是ObjectAnimator
的设置
后续行动:
我的解决方案的灵感来源于标记为“可能重复”的解决方案,然而,这并没有解决我所概述的具体情况——在对话框外点击动画
我在该链接中使用的解决方案是,当点击对话框内的按钮时,非常接近动画,但不处理
设置取消到外部(true)
可能与我添加的后续内容重复的内容。这是我用来帮助我形成解决方案的主要链接之一,但在警报对话框外部点击(setCanceledOnTouchOut(true))并不能解决我的问题