HarmonyOS 鸿蒙Next 如何将弹窗在屏幕外加载后移回屏幕?
在弹窗中展示一个Web页面,为了让用户不等待加载h5页面,需要先将弹窗展示在屏幕外,页面渲染好后会通知客户端将弹窗移动回屏幕,目前我试过将弹窗中组件translate了-1000到屏幕外,但是遮蔽层仍然是全屏,无法对原页面进行操作;用@State装饰了一个变量distance,maskRect的y引用这个变量,无法立即生效,下次再打开才会生效,我应该怎么做才能让将弹窗移到屏幕外时不会有遮蔽层影响原页面的操作?或者还有什么好的方法能实现这种效果?
目前写了一个demo,打开dialog后点击原页面的‘show’,希望将屏幕外的弹窗移动回来的同时更改maskRect,但是只能移回屏幕不能更改遮蔽层
@Entry
@Component
struct Index {
[@State](/user/State) distance: number = -100;
dialogController: CustomDialogController | undefined = undefined
[@State](/user/State) color: string = '#000000';
build() {
RelativeContainer() {
Text('Open Dialog')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(() => {
this.dialogController?.close()
this.dialogController = new CustomDialogController({
builder: DialogBuilder(),
alignment: DialogAlignment.Center,
autoCancel: false,
customStyle: true,
maskColor: this.color,
maskRect: {
x: 0,
y: this.distance,
width: '100%',
height: '100%'
}
})
this.dialogController.open()
})
Text('show')
.fontSize(40)
.onClick(() => {
this.distance = this.distance - 100
emitter.emit('changeY')
})
.alignRules({
bottom: { anchor: '__container__', align: VerticalAlign.Bottom },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
}
.height('100%')
.width('100%')
}
}
@CustomDialog
export struct DialogBuilder {
controller: CustomDialogController
[@State](/user/State) y: number = -1000
aboutToAppear(): void {
emitter.on('changeY', () => {
this.y = 0
})
}
build() {
Column() {
Text('This is a dialog')
.fontColor(Color.White)
.fontSize(50)
.backgroundColor(Color.Blue)
.fontWeight(FontWeight.Bold)
.onClick(() => {
this.y = this.y - 20
})
}
.translate({ y: this.y })
}
}
更多关于HarmonyOS 鸿蒙Next 如何将弹窗在屏幕外加载后移回屏幕?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
1、目前自定义弹窗的所有参数,暂不支持动态刷新。
2、translate是无法控制弹窗的位置的,只能控制弹窗内容的位置。
3、楼主要实现的场景可以用stack和自定义组件模拟一个弹窗,通过if条件渲染控制弹窗open,通过visibility控制弹窗的显隐。代码参考:
@Entry
@Component
struct Index {
@State show:boolean = false
@State open:boolean = false
build() {
Column() {
Stack() {
RelativeContainer() {
Text(‘Open Dialog’)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: ‘container’, align: VerticalAlign.Center },
middle: { anchor: ‘container’, align: HorizontalAlign.Center }
})
.onClick(() => {
this.open = true // 打开弹窗 并隐藏
})
Text(‘show’)
.fontSize(40)
.onClick(() => {
this.show = true // 显示弹窗
})
.alignRules({
bottom: { anchor: ‘container’, align: VerticalAlign.Bottom },
middle: { anchor: ‘container’, align: HorizontalAlign.Center }
})
}
.height(‘100%’)
.width(‘100%’)
// (可选)模拟遮罩
/**Text(’’)
.width(‘100%’)
.height(‘90%’)
.opacity(0.5)
.backgroundColor(Color.Black)
.visibility(this.open ? Visibility.Visible : Visibility.None)*/
<span class="hljs-comment">// 模拟自定义dialog</span>
<span class="hljs-keyword">if</span> (<span class="hljs-variable language_">this</span>.<span class="hljs-property">open</span>) {
<span class="hljs-title class_">DialogBuilder</span>()
.<span class="hljs-title function_">backgroundColor</span>(<span class="hljs-string">'0xffffff'</span>)
.<span class="hljs-title function_">visibility</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">show</span> ? <span class="hljs-title class_">Visibility</span>.<span class="hljs-property">Visible</span> : <span class="hljs-title class_">Visibility</span>.<span class="hljs-property">None</span>)
.<span class="hljs-title function_">clip</span>(<span class="hljs-literal">true</span>)
.<span class="hljs-title function_">borderRadius</span>(<span class="hljs-number">20</span>)
}
}
}
.<span class="hljs-title function_">width</span>(<span class="hljs-string">'100%'</span>)
.<span class="hljs-title function_">height</span>(<span class="hljs-string">'100%'</span>)
}
}
@Component
export struct DialogBuilder {
aboutToAppear(): void {
console.info(‘aboutToAppear DialogBuilder’)
}
build() {
Column() {
Text(‘This is a dialog’)
.fontColor(Color.White)
.fontSize(50)
.backgroundColor(Color.Blue)
.fontWeight(FontWeight.Bold)
}
}
}
更多关于HarmonyOS 鸿蒙Next 如何将弹窗在屏幕外加载后移回屏幕?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
有这个属性控制:
isModal
弹窗是否为模态窗口,模态窗口有蒙层,非模态窗口无蒙层。
默认值:true,此时弹窗有蒙层。
在HarmonyOS鸿蒙Next系统中,将弹窗在屏幕外加载后移回屏幕,可以通过以下步骤实现:
-
弹窗初始位置设置:在创建弹窗视图时,可以将其初始位置设置在屏幕外。这可以通过设置弹窗视图的
X
和Y
坐标来实现,确保这些坐标值位于屏幕显示范围之外。 -
加载弹窗内容:在弹窗视图初始化并设置到屏幕外后,可以加载弹窗所需的内容。此时,弹窗虽然不在屏幕内可见,但内容已经加载完成。
-
动画或平移操作:使用动画或平移操作将弹窗从屏幕外移动到屏幕内。HarmonyOS提供了丰富的动画和视图操作API,可以使用这些API来实现弹窗的平滑移动。
-
触发显示:在合适的时机(如用户点击某个按钮或满足某个条件时),触发弹窗的显示和移动操作。确保弹窗在移动到屏幕内的过程中,内容已经准备好并可以正常显示。
-
处理边界情况:确保在移动弹窗时,考虑到屏幕边界的情况,避免弹窗被部分或完全遮挡。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。