在Android版本> = 5上绘制导航栏(和其他应用程序)

我想在服务的其他应用程序上画一个(鼠标指针)图标。 我已经实现了function,除了导航栏之外,我可以在屏幕上绘制。 我在这里研究了 其他 几个 问题 ,尝试了TYPE_SYSTEM_OVERLAYTYPE_TOASTTYPE_SYSTEM_ERROR和其他一些窗口types,但都没有成功。

我不是想捕捉焦点,只需在屏幕上画一个鼠标指针一两秒。 当我尝试绘制导航栏时,它只是在下面(实际上,RelativeLayout以导航栏的边框结束 – 即使我指定了高度的手动尺寸)。 下面的屏幕截图显示了屏幕右下方的手形指针。 这是我可以定位的。 请注意,我没有试图隐藏我的应用程序中的导航栏 – 尝试绘制其他应用程序。

叠加指针在屏幕上

我甚至尝试在WindowManager.LayoutParams实例中设置xposypos偏移量设置,但刚刚抵消了布局,仍然在导航栏下方)。

我用来显示这个窗口的布局参数:

  WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, PixelFormat.TRANSPARENT); 

然后,我将这些参数的RelativeLayout添加到WindowManager: windowManager.addView(relativeLayout, params);

Solutions Collecting From Web of "在Android版本> = 5上绘制导航栏(和其他应用程序)"

经过很多的摆弄,我设法得到正确的标志,使其工作。 它几乎可行(对于大多数应用程序)。 要实现的代码如下(button单击处理程序的示例):

 @Override public void onClick(View view) { if (_windowManager == null) { _windowManager = (WindowManager) MainActivity.this.getSystemService(Context.WINDOW_SERVICE); } WindowManager.LayoutParams params; // create the view on the first try if (_overlayView == null) { ImageView hand; _overlayView = new FrameLayout(MainActivity.this); hand = new ImageView(MainActivity.this); hand.setImageResource(R.drawable.icon_hand_pointer); int w = hand.getDrawable().getIntrinsicWidth(); int h = hand.getDrawable().getIntrinsicHeight(); _overlayView.addView(hand); params = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); params.width = w; params.height = h; params.gravity = Gravity.LEFT | Gravity.TOP; params.x = _xOffset; params.y = _yOffset; _windowManager.addView(_overlayView, params); } else { // move the view params = (WindowManager.LayoutParams) _overlayView.getLayoutParams(); params.x = _xOffset; params.y = _yOffset; _windowManager.removeView(_overlayView); _overlayView.setLayoutParams(params); _windowManager.addView(_overlayView, params); } _xOffset += 40; _yOffset += 100; } 

以下是在应用程序中工作的代码的屏幕截图(您可以看到交叠图层;这是在Android 6.0.1的Nexus 5上: 在这里输入图像说明

底部的导航栏是无法绘制的东西,因为上面绘制的项目可能会阻止访问主页button,后退button等。但是,您可以将您的活动设置为全屏,这意味着它将隐藏导航button,直到你从底部向上滑动,这样你就可以自由地在屏幕上的任何地方绘制

编辑:我发现了一些类似的问题,这一个有一个答案: 在Android的导航栏顶部绘制位图答案是添加一个偏移量,这是导航栏的大小。