Android 透明窗口

介绍

在Android应用开发中,有时候我们希望实现一个透明的窗口,以便在应用的上层显示一些特殊的内容,比如悬浮窗、通知栏或者浮动按钮等。透明窗口可以让应用的用户界面与系统界面进行交互,提供更加丰富的用户体验。

本文将介绍如何在Android应用中创建透明窗口,并提供相关的代码示例。

创建透明窗口

在Android中,我们可以使用WindowManager来创建透明窗口。

步骤一:声明权限

首先,在应用的AndroidManifest.xml文件中,需要声明一些权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" />

步骤二:处理权限

在Android 6.0及以上版本中,需要动态请求悬浮窗权限。可以在应用的某个Activity中添加以下代码:

private static final int REQUEST_CODE = 1;

// 在onCreate方法中调用
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, REQUEST_CODE);
}

// 在onActivityResult方法中处理结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.canDrawOverlays(this)) {
            // 悬浮窗权限已授予
            // 在这里创建透明窗口
        } else {
            // 悬浮窗权限未授予
        }
    }
}

步骤三:创建透明窗口

创建透明窗口的代码如下所示:

WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
layoutParams.format = PixelFormat.TRANSPARENT;
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;

// 设置窗口的宽高
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;

// 添加自定义的View到窗口
View view = new View(this);
view.setBackgroundColor(Color.TRANSPARENT);
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
windowManager.addView(view, layoutParams);

上述代码中,我们创建了一个WindowManager.LayoutParams对象,并设置了相关的属性。其中,type属性指定了窗口的类型为TYPE_APPLICATION_OVERLAY,表示这是一个应用的上层窗口。format属性设置了窗口的像素格式为TRANSPARENT,即透明。flags属性设置了一些标志,以便窗口可以在不获取焦点和不拦截触摸事件的情况下显示,并且可以充满整个屏幕。

接下来,我们创建了一个自定义的View,并将其添加到窗口中。注意,这个View的背景颜色必须设置为透明,以便窗口可以透过它显示底层的内容。

示例应用

下面我们来创建一个简单的示例应用,演示如何创建一个透明窗口,并在其中显示一个浮动按钮。

步骤一:布局文件

首先,在应用的res/layout目录下创建一个名为floating_button.xml的布局文件,用于显示浮动按钮。

<RelativeLayout xmlns:android="
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <Button
        android:id="@+id/floating_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Floating Button" />

</RelativeLayout>

步骤二:创建透明窗口

接下来,在应用的某个Activity中,添加以下代码来创建透明窗口并显示浮动按钮:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDraw