触摸屏幕上始终显示的视图

时间:2014-09-16 09:53:49

标签: android android-view android-event

我的观点总是在屏幕上(超过其他应用),我不接受触摸事件而不是将它们传递得更远。

正在运行的代码Service

    WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,  
            PixelFormat.TRANSLUCENT);

    v.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Toast.makeText(getApplicationContext(), "view touched", Toast.LENGTH_SHORT).show();
            return false;
        }
    });

    WindowManager localWindowManager = (WindowManager)getSystemService("window");
    localWindowManager.addView(v, localLayoutParams);

目前我还没有接触到。

2 个答案:

答案 0 :(得分:5)

您希望将视图声明为TYPE_SYSTEM_ALERT,如下所示:

WindowManager.LayoutParams params =
        new WindowManager.LayoutParams(width, height, x, y,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
                PixelFormat.TRANSLUCENT);
params.gravity = Gravity.LEFT | Gravity.TOP;

这样它只会响应视图本身的触摸。

此代码来自我设计的工作任务切换器。我没有使用FLAG_WATCH_OUTSIDE_TOUCH,因为它在与我的叠加下面的其他窗口交互时给我带来了问题。


至于将其他应用程序传递给其他应用程序 - 这已不再可能,因为它代表了安全风险。

我最近在一个类似的问题上加入了更多细节,您可能会觉得这些问题很有趣:

另一个有趣的库mentioned by Edward Jezisek是pingpongboss的StandOut:

由于它是开源的,你可以通过代码来弄清楚他在做什么。

答案 1 :(得分:0)

我不知道为什么,但WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY让你的观点无法触及。

改为使用WindowManager.LayoutParams.TYPE_PHONE

<强>更新

我忘记了一件事。 如果您只设置WindowManager.LayoutParams.TYPE_PHONE,则不会触及其他应用的View。所以肯定会添加WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE标志。