我们先来看代码:
// 取得系统窗体 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 , 自己去查文档吧, 实际中使用的还是很少的,其中的坑也不少。。。。呵呵