Android悬浮窗穿透实现:全屏透明且记录触摸事件
抱歉,通过设置WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL和WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE以及WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,可以实现悬浮窗的全屏透明显示,并记录触摸事件的位置。然而,Android系统默认情况下,不允许悬浮窗穿透到下面的界面上进行操作,这是由于安全和用户体验的考虑。
对于非系统级的应用,无法直接实现悬浮窗穿透下面的界面。如果您拥有系统签名,可以尝试将应用变为系统级应用,这样可能可以实现您的需求。请注意,将应用变为系统级应用是需要谨慎操作的,需要对系统进行修改,存在一定的风险。
以下是一种实现悬浮窗的示例代码,供参考:
public class FloatingWindowService extends Service implements View.OnTouchListener {
private WindowManager windowManager;
private WindowManager.LayoutParams layoutParams;
private View floatingView;
private float touchX, touchY;
@Override
public void onCreate() {
super.onCreate();
// 创建悬浮窗视图
floatingView = LayoutInflater.from(this).inflate(R.layout.floating_window_layout, null);
floatingView.setOnTouchListener(this);
// 设置悬浮窗属性
layoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
layoutParams.gravity = Gravity.START | Gravity.TOP;
// 获取WindowManager实例
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 添加悬浮窗视图
windowManager.addView(floatingView, layoutParams);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
// 移除悬浮窗视图
if (floatingView != null) {
windowManager.removeView(floatingView);
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchX = event.getRawX();
touchY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
float offsetX = event.getRawX() - touchX;
float offsetY = event.getRawY() - touchY;
// 更新悬浮窗位置
layoutParams.x += offsetX;
layoutParams.y += offsetY;
windowManager.updateViewLayout(floatingView, layoutParams);
touchX = event.getRawX();
touchY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
// 处理触摸事件
// ...
break;
}
return false;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
请注意,这段代码只能实现悬浮窗的全屏透明显示,并记录触摸事件的位置,不能实现悬浮窗穿透下面的界面。如需实现悬浮窗穿透下面的界面,您需要将应用变为系统级应用,并在AndroidManifest.xml中声明SYSTEM_ALERT_WINDOW权限。
希望对您有所帮助。
原文地址: https://www.cveoy.top/t/topic/qECU 著作权归作者所有。请勿转载和采集!