10

首先感谢所有试图回复这个话题的人。

我有一个活动,我想在屏幕顶部显示一种菜单,我使用 windowmanager 来处理这个。这是关于我遇到的 UI 问题,为什么我选择 windowmanager 来做这样的菜单。但现在我想让这个菜单动画,但动画似乎没有效果。这是我的代码。

如果有人知道如何为 windowmanager 设置动画,我将不胜感激。

Animation animShowTopLine;

animShowTopLine = AnimationUtils.loadAnimation(this, R.anim.translate);
        animShowTopLine.reset();
LinearLayout top_line;
WindowManager wm;
WindowManager.LayoutParams wmParams;

LayoutInflater inflate = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

    top_line =    (LinearLayout) inflate.inflate(R.layout.line, null);

    wm =(WindowManager) getApplicationContext().getSystemService("window");

    wmParams =new WindowManager.LayoutParams();

    wmParams.type=2002;
    wmParams.format = 1;
    wmParams.flags=40;
    wmParams.width=WindowManager.LayoutParams.FILL_PARENT;
    wmParams.height=WindowManager.LayoutParams.WRAP_CONTENT;

    wmParams.gravity  = Gravity.TOP;

    wm.addView(top_line, wmParams);


    top_line.startAnimation(animShowTopLine);

提前致谢。问候。

4

3 回答 3

19

首先,为了您自己的理智,请不要对一堆这样的常量进行硬编码。窗口管理器服务的名称是Context.WINDOW_SERVICE。窗口类型是WindowManager.LayoutParams.TYPE_PHONE。您设置的标志是……嗯…… WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE(说真的,也用十进制写??)。格式是PixelFormat.RGBA_8888(我强烈建议PixelFormat.TRANSLUCENT改用)。

现在,首先,世界上正在做什么 using TYPE_PHONE?你不想那样做。如果您希望在主窗口顶部有一个分层的窗口,您应该使用TYPE_APPLICATION. 事实上,我会敦促您只使用Dialog它并将其附加窗口设置为您想要的。它将处理使用窗口管理器的所有细节,并且不会以任何方式限制您如何为其设置动画。

我认为您在这里遇到的主要问题是您正在尝试为窗口的根视图设置动画。根视图有些特殊——它定义了窗口的最顶部,与窗口完全匹配,并且总是强制为窗口的大小。它是驱动其子窗口布局的原因。如果你想做一个视图动画,你应该单独留下根视图(它是窗口的锚点)并动画它里面的元素。

也就是说,由于您使用的是旧式动画,因此有更好的方法来为整个窗口设置动画,系统为对话框和活动设置动画的方式等:在窗口的布局参数中设置动画。然后窗口管理器将按照您的指定将该动画应用到整个窗口表面。这比在窗口内执行更有效,因为动画的每一帧只需要使用新的动画转换重新合成屏幕,而不是重新绘制窗口内容然后重新合成它。

您可以通过设置WindowManager.LayoutParams.windowAnimations. 这是一个整数字段,它采用定义与窗口相关的各种动画的样式资源的资源 id 。例如,用于标准对话框的样式是:

<style name="Animation.Dialog">
    <item name="windowEnterAnimation">@anim/dialog_enter</item>
    <item name="windowExitAnimation">@anim/dialog_exit</item>
</style>

您将windowEnterAnimation动画资源设置为在显示窗口时运行,并windowExitAnimation设置为在隐藏时运行的动画资源。如果未设置,则不运行动画。

因此,对于您的代码,您可以只创建一个对话框,将其内容设置为您的自定义内容,将其重力、宽度和高度设置为您在此处拥有的值,并将其windowAnimations字段设置为您定义动画的样式。如果您想要一些与默认对话框不同的行为(不是触摸模式等),您还可以调整标志。上的 APIDialog.getWindow()具有设置布局参数所需的一切。

于 2013-01-08T02:38:50.410 回答
2

mParams.windowAnimations = android.R.style.Animation_Toast;

于 2014-06-26T03:05:12.043 回答
0
mParams.windowAnimations = android.R.style.Animation_Toast;

其中 android.R.style.Animation_Toast 是定义用于此窗口的动画的样式资源。这必须是系统资源,不能是应用程序资源,因为窗口管理器无权访问应用程序。

其他有效的样式是:

mParams.windowAnimations = android.R.style.Animation_Translucent;
mParams.windowAnimations = android.R.style.Animation_Dialog;
于 2021-05-31T09:56:00.063 回答