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

时间:2015-07-20 12:06:41

标签: android navigationbar android-fullscreen

我想在屏幕上绘制一个(鼠标指针)图标,而不是服务中的其他应用程序。我已经实现了功能,除了导航栏,我可以在屏幕上绘图。我在这里研究了several other questions并尝试了TYPE_SYSTEM_OVERLAYTYPE_TOASTTYPE_SYSTEM_ERROR和其他一些窗口类型但没有成功。

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

overlay-pointer-on-screen

我甚至尝试在xpos实例中设置yposWindowManager.LayoutParams偏移量设置,但这只是偏移了布局并仍位于导航栏下方。

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

        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);

2 个答案:

答案 0 :(得分:10)

经过大量的摆弄,我设法得到了正确的旗帜,让它发挥作用。它几乎适用(对于大多数应用程序)。要实现的代码如下(按钮单击处理程序的示例):

@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上: enter image description here

答案 1 :(得分:2)

底部的导航栏是无法绘制的,因为上面绘制的项目可能会妨碍访问主页按钮,后退按钮等。但是您可以将您的活动全屏显示,这意味着它会隐藏导航按钮,直到您从底部向上滑动,以便您可以在屏幕上的任意位置自由绘制

编辑:我发现了一些类似的问题,这个问题有一个答案:Draw bitmaps on top of the Navigation bar in Android 答案是添加一个y偏移量,该偏移量是导航栏的大小。