android - 带动画的窗口管理器

标签 android android-animation window-managers translate-animation

首先感谢所有尝试回复此主题的人。

我有一个 Activity ,我想在屏幕顶部显示一种菜单,我使用 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);

提前致谢。问候。

最佳答案

首先,为了您的理智,请不要硬编码一堆这样的常量。窗口管理器服务的名称是 Context.WINDOW_SERVICE。窗口类型是 WindowManager.LayoutParams.TYPE_PHONE。你设置的标志是......嗯......格式为 PixelFormat.RGBA_8888(我强烈建议改用 PixelFormat.TRANSLUCENT)。

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

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

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

您可以通过设置 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 字段到你定义动画的风格。如果你想要一些不同于默认对话框的行为(不是触摸模式等),你也可以调整标志。 Dialog.getWindow() 上的 API 包含设置布局参数所需的一切。

关于android - 带动画的窗口管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6839683/

相关文章:

java - Android java框架集成

android - 无法停止媒体播放器?

android - 哪个更好 : Parse or AWS

performance - 轻量级 X 窗口管理器/环境

linux - 检索 Ubuntu 启动器图标

android - Firebase Firestore阻止Gradle完成构建

android - 单击 Android 中的 EditText 上下移动 View

android - 如何剪辑过渡动画以仅在 subview 中绘制?

android - 如何添加自定义动画viewpager

python - 如何监控在 linux/tcl/python 中打开或启动的应用程序?