Android 全屏透明悬浮窗实现:触摸穿透与位置记录 - 代码示例
要实现这样的悬浮窗效果,你需要使用WindowManager来添加悬浮窗,并设置LayoutParams来实现透明、全屏和触摸事件穿透的效果。下面是一个简单的示例代码:\n\njava\nimport android.content.Context;\nimport android.graphics.PixelFormat;\nimport android.os.Build;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.WindowManager;\n\npublic class FloatingWindowManager {\n private Context mContext;\n private WindowManager mWindowManager;\n private View mFloatingView;\n\n public FloatingWindowManager(Context context) {\n mContext = context;\n mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);\n }\n\n public void showFloatingWindow() {\n // 创建悬浮窗视图\n mFloatingView = new View(mContext);\n mFloatingView.setBackgroundColor(0x80000000); // 设置为透明背景色\n WindowManager.LayoutParams params = new WindowManager.LayoutParams(\n WindowManager.LayoutParams.MATCH_PARENT,\n WindowManager.LayoutParams.MATCH_PARENT,\n Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?\n WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :\n WindowManager.LayoutParams.TYPE_PHONE,\n WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,\n PixelFormat.TRANSLUCENT\n );\n params.gravity = Gravity.START | Gravity.TOP;\n mWindowManager.addView(mFloatingView, params);\n }\n\n public void hideFloatingWindow() {\n if (mFloatingView != null) {\n mWindowManager.removeView(mFloatingView);\n mFloatingView = null;\n }\n }\n\n // 处理触摸事件\n public boolean onTouch(MotionEvent event) {\n // 记录触摸位置\n float x = event.getRawX();\n float y = event.getRawY();\n\n // 返回false,使触摸事件穿透下去\n return false;\n }\n}\n\n\n在你的Activity中,你可以按照以下方式使用FloatingWindowManager:\n\njava\npublic class MainActivity extends AppCompatActivity implements View.OnTouchListener {\n private FloatingWindowManager mFloatingWindowManager;\n\n @Override\n protected void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.activity_main);\n\n // 创建FloatingWindowManager实例\n mFloatingWindowManager = new FloatingWindowManager(this);\n\n // 显示悬浮窗\n mFloatingWindowManager.showFloatingWindow();\n\n // 设置触摸监听器,处理触摸事件\n mFloatingWindowManager.getFloatingView().setOnTouchListener(this);\n }\n\n @Override\n protected void onDestroy() {\n super.onDestroy();\n // 隐藏悬浮窗\n mFloatingWindowManager.hideFloatingWindow();\n }\n\n @Override\n public boolean onTouch(View v, MotionEvent event) {\n // 处理触摸事件\n return mFloatingWindowManager.onTouch(event);\n }\n}\n\n\n这样就可以实现一个透明的悬浮窗,并且能够穿透触摸事件到下面的界面,并记录触摸位置。请注意,在Android 8.0及以上版本,需要使用TYPE_APPLICATION_OVERLAY作为LayoutParams的类型。
原文地址: https://www.cveoy.top/t/topic/qEBy 著作权归作者所有。请勿转载和采集!