抱歉,通过设置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权限。

希望对您有所帮助。

Android悬浮窗穿透实现:全屏透明且记录触摸事件

原文地址: https://www.cveoy.top/t/topic/qECU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录