Windowmanager与动画

Ome*_*URT 9 android window-managers android-animation translate-animation

首先感谢所有试图回复此主题的人.

我有一个活动,我想在屏幕顶部显示一种菜单,我使用windowmanager来处理这个问题.这是关于我遇到的UI问题,为什么我选择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);
Run Code Online (Sandbox Code Playgroud)

提前致谢.问候.

hac*_*bod 18

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

现在,首先,世界上正在使用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>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 要添加到Dianne的答案,如果您决定使用`windowAnimations`字段,则指定的常量必须是系统资源; 它不能是应用程序资源,因为窗口管理器无权访问应用程序.请参阅[文档](https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#windowAnimations). (3认同)