Android 全屏透明悬浮窗实现及点击事件记录

本文将介绍如何实现一个全屏的透明悬浮窗,并记录点击事件的位置。同时,我们希望点击事件可以穿透悬浮窗,点击到下面的界面,无论该界面是否属于当前 App。

实现步骤

  1. 创建透明 Activity

    创建一个新的 Activity 作为悬浮窗。在 AndroidManifest.xml 文件中,设置该 Activity 的主题为透明:

    <activity
        android:name=".FloatingWindowActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
    
  2. 添加透明 FrameLayout

    FloatingWindowActivity 的布局文件中,添加一个透明的 FrameLayout 用于显示悬浮窗内容:

    <FrameLayout
        android:id="@+id/floatingWindowLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/transparent" />
    
  3. 设置悬浮窗参数

    FloatingWindowActivity 中,设置 WindowManager.LayoutParams 参数,使 Activity 成为一个悬浮窗,并将其显示在屏幕上:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_floating_window);
    
        // 设置WindowManager.LayoutParams参数
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, // 悬浮窗类型,需要悬浮窗权限
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // 不获取焦点
                PixelFormat.TRANSLUCENT); // 透明窗口
    
        // 获取WindowManager对象
        WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    
        // 将Activity显示为悬浮窗
        windowManager.addView(getWindow().getDecorView(), params);
    }
    
  4. 记录点击事件位置

    FloatingWindowActivity 中,设置点击事件监听器,记录点击事件的位置:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            float x = event.getX();
            float y = event.getY();
    
            // TODO: 处理点击事件的位置
        }
        return super.onTouchEvent(event);
    }
    
  5. 设置点击事件不拦截

    FloatingWindowActivityonCreate() 方法中,设置点击事件不拦截,以便点击事件穿透到下面的界面:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
    }
    
  6. 添加悬浮窗权限

    AndroidManifest.xml 文件中,为 FloatingWindowActivity 添加权限,以请求悬浮窗权限:

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    
  7. 请求悬浮窗权限(Android 11 及更高版本)

    在 Android 11 及更高版本中,需要向用户请求悬浮窗权限。你可以通过以下代码请求悬浮窗权限:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, PERMISSION_REQUEST_CODE);
    }
    

总结

通过以上步骤,你就可以创建一个全屏透明的悬浮窗,并记录点击事件的位置,同时确保点击事件可以穿透到下面的界面。记住,在 Android 11 及更高版本中,你需要向用户请求悬浮窗权限。

Android 全屏透明悬浮窗实现及点击事件记录

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

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