1.创建悬浮窗和显示
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);
}
2.隐藏悬浮窗
private void hideFloatWindow() {
mWm.removeView(mResultTv);
}
3.权限判断和添加
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);
}