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

All*_*ane 18 java notifications android view

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

在此输入图像描述

如果有可能动态绘制它包括触摸事件会更好.执行此操作的传统或标准方法是什么?

例:

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

小智 10

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

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


Joe*_*ply 10

以下是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);
Run Code Online (Sandbox Code Playgroud)

然后一定要删除onDestroy(或onPause)视图,否则你会崩溃

   if (mTestView != null) {
       WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
       if (mTestView.isShown()) {
            windowManager.removeViewImmediate(mTestView);
       }
   }
Run Code Online (Sandbox Code Playgroud)


Sto*_*lly 9

您不需要新活动来执行此操作.您需要做的就是在现有活动中添加另一个视图并将其置于最前面,并将所需内容绘制/写入该视图.

如果你想用这个额外的视图做特殊的事情,你可以创建自己的视图类

class DrawOnTop extends View { 
    public DrawOnTop(Context activity) { 
        super(activity);
    }

    @Override 
    protected void onDraw(Canvas canvas) {
        // put your drawing commands here
    }

}
Run Code Online (Sandbox Code Playgroud)

然后你做了类似的事情

DrawOnTop mDraw = new DrawOnTop(this);
addContentView(mDraw, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mDraw.bringToFront();
Run Code Online (Sandbox Code Playgroud)

然后强制它绘制,你需要使用mDraw.invalidate();