本文共 2739 字,大约阅读时间需要 9 分钟。
private void showFloatWindow() { mResultTv = new TextView(mContext); mResultTv.setBackgroundColor(mContext.getColor(R.color.float_bg)); mResultTv.setTextColor(mContext.getColor(R.color.white)); mResultTv.setOnTouchListener(new View.OnTouchListener() { int lastX = 0; int lastY = 0; int paramX = 0; int paramY = 0; @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) motionEvent.getRawX(); lastY = (int) motionEvent.getRawY(); paramX = mParams.x; paramY = mParams.y; break; case MotionEvent.ACTION_MOVE: int dx = (int) motionEvent.getRawX() - lastX; int dy = (int) motionEvent.getRawY() - lastY; mParams.x = paramX + dx; mParams.y = paramY + dy; // update float window mWm.updateViewLayout(mResultTv, mParams); break; } return true; } }); mParams = new WindowManager.LayoutParams(); mParams.width = WindowManager.LayoutParams.WRAP_CONTENT; mParams.height = WindowManager.LayoutParams.WRAP_CONTENT; // 悬浮窗的核心 mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; // 设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作) mParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; mParams.format = PixelFormat.TRANSPARENT; mWm.addView(mResultTv, mParams); }
private void hideFloatWindow() { mWm.removeView(mResultTv); }
AndroidManifest.xml
//判断权限 private boolean isCanDrawOverlays(Context context) { Boolean result = true; if (Build.VERSION.SDK_INT >= 23) { try { Class clazz = Settings.class; Method canDrawOverlays = clazz.getDeclaredMethod("canDrawOverlays", Context.class); result = (Boolean) canDrawOverlays.invoke(null, context); } catch (Exception e) { e.printStackTrace(); } } return result; } //申请权限 private void requestAlertWindowPermission() { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.setData(Uri.parse("package:" + mContext.getPackageName())); startActivityForResult(intent, REQUEST_CODE); }