WindowManger 事件接收 不能接收onTouch

来源:互联网 发布:淘宝网pc客户端下载 编辑:程序博客网 时间:2024/05/21 09:11

我们先来看代码:

        // 取得系统窗体        mWindowManager = (WindowManager) getApplicationContext()                .getSystemService(Context.WINDOW_SERVICE);        // 窗体的布局样式        mLayout = new WindowManager.LayoutParams();        // 设置窗体显示类型——TYPE_SYSTEM_ALERT(系统提示)        mLayout.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;        // 设置窗体焦点及触摸:        // FLAG_NOT_FOCUSABLE(不能获得按键输入焦点)//        mLayout.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |//                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE|//                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;        mLayout.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;   //当前Window区域以外的点击事件传递给下层window,当前window区域以内的点击事件自己处理        // 设置显示的模式        mLayout.format = PixelFormat.RGBA_8888;        // 设置对齐的方法        mLayout.gravity = Gravity.TOP | Gravity.CENTER;        // 设置窗体宽度和高度        mLayout.width = WindowManager.LayoutParams.WRAP_CONTENT;        mLayout.height = WindowManager.LayoutParams.WRAP_CONTENT;        //将制定View解析后添加到窗口管理器里面        mWindowsView = View.inflate(this, R.layout.windows_layout, null);        mVVWindows = (VideoView) mWindowsView.findViewById(R.id.videoView);        playVideo(mVVWindows);        mWindowManager.addView(mWindowsView, mLayout);        mWindowsView.setFocusable(true);        mWindowsView.setFocusableInTouchMode(true);        mWindowsView.setOnTouchListener(new View.OnTouchListener() {            float mTouchStartX;            float mTouchStartY;            @Override            public boolean onTouch(View view, MotionEvent event) {                x = event.getRawX();                y = event.getRawY() -25;  //25是 系统状态栏的高度                switch (event.getAction()) {                    case MotionEvent.ACTION_DOWN:                        mTouchStartX = event.getX();                        mTouchStartY = event.getY();                        break;                    case MotionEvent.ACTION_MOVE:                        //原始坐标减去移动坐标                        mLayout.x = (int) (x - mTouchStartX);                        mLayout.y = (int) (y - mTouchStartY);                        mWindowManager.updateViewLayout(mWindowsView, mLayout);                        Log.i("main", "x=" + x + "\ny=" + y + "\nmTouchX" + mTouchStartX + "\nmTouchY=" + mTouchStartY);                        break;                }                return true;            }        });


这里:我们只需要注意WindowManger参数中的flags ,如果我们去掉它,完全不写flags参数,此时可以接收到Touch事件,如果设置了  ,这里有很多坑等着你。。

所以这里的flags不要随便写:

WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
表示的是该window处产生的事件可以自行处理,区域以外的交由下层window处理。

WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
这个,不仅表示不获取焦点,而且touch事件都不能传递给它,你都不获取焦点了,我干啥要交给你事件啊。

WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
顾名思义,我不处理Touch事件。


还有其他的flags  , 自己去查文档吧, 实际中使用的还是很少的,其中的坑也不少。。。。呵呵


0 0