如何在一切之上绘制视图?

2022-09-02 03:40:05

我想创建一个应用程序,可以在当前显示的任何内容之上的屏幕上创建通知。类似于Go SMS消息弹出窗口或类似下图中的ChatHead的内容:

enter image description here

如果可以动态绘制它(包括触摸事件),那就更好了。这样做的传统或标准方法是什么?

例:

就像一个图标,无论你是在主屏幕还是应用程序抽屉或其他应用程序上,都可以单击或拖动。请注意发布的图片中屏幕边缘附近的圆形图标。您可以将它们拖到任何应用中的任意位置。


答案 1

您正在寻找的是系统警报窗口。

有一个名为StandOut的图书馆!这将帮助您创建此类应用程序。


答案 2

以下是Toast和对话框窗口等内容的工作原理:

如果只是添加或引入到前台不起作用,例如,当您让服务将其自己的视图添加到另一个客户端活动或应用程序时(FaceUnlock会执行此操作),或者您无法依赖层次结构,则需要使用窗口管理器和窗口令牌来执行该操作。然后,您可以像以前一样创建布局并利用动画和硬件加速。

    WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);

    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.FIRST_SUB_WINDOW);
    layoutParams.width = 300;
    layoutParams.height = 300;

    layoutParams.format = PixelFormat.RGBA_8888;
    layoutParams.flags =
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
    layoutParams.token = getWindow().getDecorView().getRootView().getWindowToken();

    //Feel free to inflate here
    mTestView = new View(this);
    mTestView.setBackgroundColor(Color.RED);

    //Must wire up back button, otherwise it's not sent to our activity
    mTestView.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                onBackPressed();
            }
            return true;
        }
    });
    windowManager.addView(mTestView, layoutParams);

然后确保删除视图在Destroy(或onPause)上,否则您将崩溃

   if (mTestView != null) {
       WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
       if (mTestView.isShown()) {
            windowManager.removeViewImmediate(mTestView);
       }
   }