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

标签 android navigationbar android-fullscreen

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

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

overlay-pointer-on-screen

我什至尝试在 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);

最佳答案

经过大量调整后,我设法获得了正确的标志以使其正常工作。它几乎可以工作(对于大多数应用程序)。实现的代码如下(按钮单击处理程序的示例):

@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

关于android - 在 Android 版本 >= 5 上绘制导航栏(和其他应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31516089/

相关文章:

Android:暂停和恢复 Activity 中的线程

android - 迁移到适用于 Android Q 的范围存储

objective-c - 通过 UISplitViewController 的 iOS 7 导航栏显示褪色的灰色 View

java - 返回时无法访问代码 START_STICKY;

ios - Xcode 11.4。导航的标题颜色从 Storyboard中变为黑色

xcode - 导航栏颜色问题

android - 如何使Android应用程序屏幕全屏显示?

android - 单击 Recyclerview 对象 ImageView 时如何显示全屏图像?

Android 沉浸式模式转换

android - 如何删除 ListView 中的项目填充?