Android 开发:实现完全透明可穿透的悬浮窗?
很抱歉之前的回答没有满足您的需求。在 Android 开发中,实现一个完全透明且可穿透的悬浮窗是比较困难的,因为 Android 系统对于悬浮窗的限制比较多。以下是一种可能的实现方法,但无法完全保证触摸事件的穿透。
- 首先,在
AndroidManifest.xml文件中添加如下权限:
<uses-permission android:name='android.permission.SYSTEM_ALERT_WINDOW' />
- 创建一个继承自
Service的类,用于实现悬浮窗的逻辑,命名为FloatingWindowService。
public class FloatingWindowService extends Service {
private WindowManager windowManager;
private View floatingView;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
// 创建一个透明的悬浮窗 View
floatingView = new View(this);
// 设置悬浮窗的位置和大小,这里设置为全屏
WindowManager.LayoutParams params = 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
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSPARENT);
// 将悬浮窗 View 添加到 WindowManager 中
windowManager.addView(floatingView, params);
}
@Override
public void onDestroy() {
super.onDestroy();
if (floatingView != null) {
windowManager.removeView(floatingView);
}
}
}
- 在
MainActivity中启动FloatingWindowService:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 启动 FloatingWindowService
Intent intent = new Intent(this, FloatingWindowService.class);
startService(intent);
}
}
请注意,上述代码并不能保证触摸事件能够完全穿透悬浮窗并正常操作下面的界面。由于 Android 系统对于悬浮窗的限制,无法直接实现触摸事件的穿透。目前,只有系统级应用才能实现完全透明且可穿透的悬浮窗。对于普通应用,Android 系统限制了悬浮窗的行为,以保证用户的安全和隐私。
如果您需要实现更复杂的悬浮窗功能,建议您参考 Android 官方文档和相关技术博客,并根据实际需求进行调整和优化。
原文地址: https://www.cveoy.top/t/topic/qECM 著作权归作者所有。请勿转载和采集!