То, что я хотел сделать, это добавить анимацию в диалог, когда его касаются снаружи. Сенсорный внешний код был легок, но способ оживить был трудным. Я хочу, чтобы он скользнул вверх.
После недели попыток найти решение я нашел способ переопределить значение по умолчанию dialog.setCanceledOnTouchOutside(true)
и установить для него анимацию.
Вот что я сделал. Я исследую http://iserveandroid.blogspot.com/2011/04/how-to-dismiss-your-non-modal-dialog.html и отсюда я смог найти, как добавить анимацию к FLAG_WATCH_OUTSIDE_TOUCH
, и наткнулся на это
WindowManager с анимацией (возможно ли это?)
Отсюда я смог реализовать это wmlp.windowAnimations = R.style.CFDialog_Animation;
Вот мой код:
AlertDialog helpDialog = alert.create();
helpDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
WindowManager.LayoutParams wmlp =
helpDialog.getWindow().getAttributes();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
wmlp.gravity = Gravity.TOP;
wmlp.y = 200; //y position
helpDialog.show();
} else {
// if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O)
wmlp.gravity = Gravity.TOP;
wmlp.y = 180; //y position
helpDialog.show();
}
//this code below is what overrides it and add the animation
wmlp.windowAnimations = R.style.CFDialog_Animation;
///optional, your preference
Window window = helpDialog.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
window.setFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
Я также использую дополнительные коды, чтобы сделать его не моделью, чтобы его можно было отменить / отклонить, когда вы касаетесь объекта вне диалогового окна (необязательно)
Теперь, когда вы щелкаете за пределами диалогового окна, оно скользит вверх. Конечно, вы можете использовать свою собственную анимацию. wmlp.windowAnimations = android.R.style.Animation_Translucent;
заставляет его идти в сторону. Я не знаю почему.
Вот мой стиль:
<style name="CFDialog.Animation">
<item name="android:windowExitAnimation">@anim/alert_dismiss</item>
</style>
и анимация alert_dimiss
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:interpolator="@android:anim/anticipate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="1000" />
<translate android:fromYDelta="00%" android:toYDelta="-100%"
android:duration="500"/>
</set>
Надеюсь, что это поможет другим, которые ищут решение