首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HarmonyOS NEXT开发教程:全局悬浮窗

今天跟大家分享一下HarmonyOS开发中的悬浮窗。

对于悬浮窗,可能有的同学会想到使用层叠布局是否可以实现,将悬浮窗叠在导航栏组件Tabs上,像这样:

Stack({alignContent:Alignment.BottomEnd}){

Tabs({barPosition:BarPosition.End}){

TabContent(){

Text('page1')

.fontColor(Color.Black)

.fontSize(40)

}

.tabBar(this.Tabbar())

TabContent(){

Page2()

}

.tabBar(this.Tabbar())

}

Row(){

//这是悬浮窗

}

.width(60)

.height(60)

.borderRadius(30)

.backgroundColor(Color.Blue)

}

这样的布局在push到下一个页面时悬浮窗就会消失,所以是行不通的。

对于悬浮窗鸿蒙系统有专属的创建方法,就是使用createSubWindow创建子窗口,这个子窗口会悬浮在整个应用上方。具体实现代码如下:

windowStage.createSubWindow('floatWindow',(err: BusinessError, data) =>})

在创建完成后,可以设置悬浮窗的尺寸、位置和内容等属性,要注意这里的单位是px,且只能传正整数类型:

//尺寸

data.resize(300,300,(err: BusinessError) =>})

//位置

data.moveWindowTo(400,400,(err: BusinessError) =>})

//展示

data.showWindow((err: BusinessError) =>});

有的时候你可能需要设置悬浮窗是圆形,办法是先去对应的内容页面设置圆角后发现还是会有白色的背景,然后把窗口背景色设置为透明,这个方法最好在setUIContent的回调中设置:

data?.setWindowBackgroundColor('#00000000');

当需要关闭悬浮窗时,可以调用destroyWindow方法进行销毁:

window.findWindow(FloatUntil.windowName).destroyWindow()

以上就是悬浮窗的常见使用方法,为了便于使用,我把以上方法进行了简单的封装,可以一行代码就实现悬浮窗的展示、移动、关闭等操作:

import EntryAbility from "../entryability/EntryAbility";

import { BusinessError } from "@kit.BasicServicesKit";

import { display, window } from "@kit.ArkUI";

export class FloatUntil{

static screen_width = display.getDefaultDisplaySync().width

static screen_height = display.getDefaultDisplaySync().height

static float_size = 420

static float_positon_x = FloatUntil.screen_width - FloatUntil.float_size - 40

static float_positon_y = FloatUntil.screen_height - FloatUntil.float_size - 440

static windowName = 'floatWindow'

static creatAndShowSubWindow(){

EntryAbility.gloabalWindowStage.createSubWindow(FloatUntil.windowName, (err: BusinessError, data) => {

let errCode: number = err.code;

if (errCode) {

return;

}

//位置、尺寸单位是px,只支持正整数

data.moveWindowTo(FloatUntil.float_positon_x, FloatUntil.float_positon_y, (err: BusinessError) => {

let errCode: number = err.code;

if (errCode) {

return;

}

console.info('Succeeded in moving the window.');

});

data.resize(FloatUntil.float_size, FloatUntil.float_size, (err: BusinessError) => {

let errCode: number = err.code;

if (errCode) {

return;

}

});

//悬浮窗是否可触

data.setWindowTouchable(true);

data.setUIContent("pages/FloatWindow", (err: BusinessError) => {

let errCode: number = err.code;

if (errCode) {

console.error('Failed to load the content. Cause:' + JSON.stringify(err));

return;

}

console.info('Succeeded in loading the content.');

//设置窗口背景色透明,只有在这调用才不会报错

data?.setWindowBackgroundColor('#00000000');

data.showWindow((err: BusinessError) => {

let errCode: number = err.code;

if (errCode) {

console.error('Failed to show the window. Cause: ' + JSON.stringify(err));

return;

}

console.info('Succeeded in showing the window.');

});

});

})

}

static moveWindowTo(x:number,y:number){

window.findWindow(FloatUntil.windowName).moveWindowTo(x,y)

}

static destroyFloatWindow(){

window.findWindow(FloatUntil.windowName).destroyWindow()

}

}

#HarmonyOS语言##ArkTs##工具效率#

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O-YOZHKY4dPRX5jRiU9k7ozA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券