Android 全屏透明悬浮窗实现及点击事件记录
Android 全屏透明悬浮窗实现及点击事件记录
本文将介绍如何实现一个全屏的透明悬浮窗,并记录点击事件的位置。同时,我们希望点击事件可以穿透悬浮窗,点击到下面的界面,无论该界面是否属于当前 App。
实现步骤
-
创建透明 Activity
创建一个新的 Activity 作为悬浮窗。在
AndroidManifest.xml文件中,设置该 Activity 的主题为透明:<activity android:name=".FloatingWindowActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" /> -
添加透明 FrameLayout
在
FloatingWindowActivity的布局文件中,添加一个透明的FrameLayout用于显示悬浮窗内容:<FrameLayout android:id="@+id/floatingWindowLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" /> -
设置悬浮窗参数
在
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); } -
记录点击事件位置
在
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); } -
设置点击事件不拦截
在
FloatingWindowActivity的onCreate()方法中,设置点击事件不拦截,以便点击事件穿透到下面的界面:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); } -
添加悬浮窗权限
在
AndroidManifest.xml文件中,为FloatingWindowActivity添加权限,以请求悬浮窗权限:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> -
请求悬浮窗权限(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 及更高版本中,你需要向用户请求悬浮窗权限。
原文地址: https://www.cveoy.top/t/topic/qEyW 著作权归作者所有。请勿转载和采集!