鸿蒙应用框架透明度设置的实际问题及解决方案

问题描述

在使用鸿蒙应用框架开发应用时,我们经常会遇到需要设置应用窗口透明度的需求。然而,鸿蒙应用框架并没有直接提供设置窗口透明度的方法,这给开发者带来了一些困扰。那么,我们应该如何解决这个问题呢?

解决方案

为了解决这个问题,我们可以借助一些其他的技巧来实现应用窗口透明度的设置。下面,我将介绍一种通过使用鸿蒙应用框架提供的Surface组件以及Java Native Interface(JNI)来实现透明度设置的方法。

示例场景

假设我们正在开发一个天气应用,我们希望应用的主界面能够具有一定的透明度,以提高用户体验。我们可以在应用启动时,让主界面以80%的透明度展示,同时保持用户可以进行交互操作。

实现步骤

  1. 首先,我们需要在应用的build.gradle文件中添加对Surface组件的依赖,以便使用Surface组件进行界面绘制。在dependencies中添加以下代码:
implementation ‘ohos.agp.components:Surface:1.0.0.0’
  1. 在应用的主界面布局文件中,我们需要添加一个Surface组件作为根布局。在xml文件中添加以下代码:
<?xml version=“1.0” encoding=“utf-8”?>
<DirectionalLayout xmlns:ohos=“

ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">

<Surface
    ohos:id="$+id:surface_view"
    ohos:height="match_parent"
    ohos:width="match_parent" />

</DirectionalLayout>

JNISurfaceUtilsnativeSetWindowAlpha
package com.example.weatherapp;

public class JNISurfaceUtils {

static {
    System.loadLibrary("surface_utils");
}

public static native void nativeSetWindowAlpha(long surfacePtr, float alpha);

}

onStart
@Override
public void onStart(Intent intent) {

super.onStart(intent);

SurfaceView surfaceView = (SurfaceView) findComponentById(ResourceTable.Id_surface_view);
long surfacePtr = surfaceView.getNativeHandle();

JNISurfaceUtils.nativeSetWindowAlpha(surfacePtr, 0.8f);

}

entrysurface_utils.cpp
#include ”surface_utils.h“

#include <native/window.h>

JNIEXPORT void JNICALL Java_com_example_weatherapp_JNISurfaceUtils_nativeSetWindowAlpha(JNIEnv *env, jclass clazz,

                                                                                  jlong surfacePtr, jfloat alpha) {
ANativeWindow *window = reinterpret_cast<ANativeWindow *>(surfacePtr);
ANativeWindow_setBuffersGeometry(window, ANativeWindow_getWidth(window), ANativeWindow_getHeight(window),
                                 WINDOW_FORMAT_RGBA_8888);
ANativeWindow_setBuffersAlpha(window, alpha);

}

entrysurface_utils.h
#include <jni.h>

extern ”C“ { JNIEXPORT void JNICALL Java_com_example_weatherapp_JNISurfaceUtils_nativeSetWindowAlpha(JNIEnv *env, jclass clazz,

                                                                                  jlong surfacePtr, jfloat alpha);