动画时,Dialog会跳到屏幕顶部

时间:2015-01-23 16:47:30

标签: android dialog

预期行为:

  1. 对话框从屏幕下方显示到底部约80%
  2. Dialog在那里呆了3秒
  3. Dialog返回屏幕
  4. 真正发生的事情:

    1. 对话框从屏幕下方显示到底部约80%
    2. 对话框跳转到屏幕顶部
    3. Dialog在那里呆了3秒
    4. 对话框跳回屏幕底部约80%
    5. Dialog返回屏幕
    6. 为什么?

      向上滑动:

      <?xml version="1.0" encoding="utf-8"?>
      <translate xmlns:android="http://schemas.android.com/apk/res/android"
            android:fromYDelta="100%p"
            android:toYDelta="75%p"
            android:fillAfter="true"
            android:duration="1000" />
      

      向下滑动:

      <?xml version="1.0" encoding="utf-8"?>
      <translate xmlns:android="http://schemas.android.com/apk/res/android"
              android:fromYDelta="75%p"
              android:toYDelta="100%p"
              android:fillAfter="true"
              android:duration="1000" />
      

      风格:

      <style name="dialog_animation">
          <item name="android:windowEnterAnimation">@anim/slide_up</item>
          <item name="android:windowExitAnimation">@anim/slide_down</item>
      </style>
      

      代码:

      dialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);
      dialog.setContentView(R.layout.toast_goal_added);
      dialog.getWindow().getAttributes().windowAnimations = R.style.dialog_animation;
      dialog.setCancelable(true);
      Handler handler = null;
          handler = new Handler(); 
          handler.postDelayed(new Runnable(){ 
               public void run(){
                   dialog.cancel();
                   dialog.dismiss();
               }
          }, 3500);
      dialog.show();
      

2 个答案:

答案 0 :(得分:0)

您的代码确实描述了以下内容:

  1. 对话框从屏幕下方显示到底部约80% - 动画正确结束
  2. 对话框跳转到屏幕顶部 - 动画不会影响对话框的实际位置,您只需创建一个动画将对话框移动到给定的Y坐标,但是您永远不会告诉对话框移位到正确的位置动画后的位置。
  3. Dialog在那里停留3秒钟 - 当然,动画与此
  4. 无关
  5. 对话框跳回到屏幕底部的大约80% - 很明显,你从给定的Y开始动画,但是你永远不会告诉对话框在动画之前被移动到正确的位置。
  6. 对话框回到屏幕下 - 显而易见。
  7. 解决方案 - 您需要确定对话框在动画后应保留的实际位置。使用自定义坐标进行对话时,这是完全相同的事情。但现在你可以轻松添加75%的屏幕。

    要开始的一些代码:

    Dialog dlg = <code to create custom dialog>;
    
    Window window = dlg.getWindow();
    WindowManager.LayoutParams wlp = window.getAttributes();
    
    wlp.gravity = Gravity.BOTTOM;
    wlp.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
    window.setAttributes(wlp);
    

    在这里,您可以在屏幕尺寸的加入中添加对话框的Y坐标。

答案 1 :(得分:0)

我设法使用以下代码执行此操作,但您需要考虑重要的事情。 TranslationAnimation不允许使用onClick事件,因为只有坐标被更改但视图本身没有被移动,这意味着视图不会移动到任何地方,它只是看起来像是在移动。

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

  <translate
    android:duration="200"
    android:fromYDelta="100%p"
    android:toYDelta="75%p" />

  <translate
    android:duration="200"
    android:startOffset="2500"
    android:fromYDelta="0%p"
    android:toYDelta="25%p" />
</set>