ArtTS系统能力-窗口管理的学习(3.2)

news2024/7/4 5:37:39

上篇回顾: ArtTS系统能力-通知的学习(3.1)

本篇内容: ArtTS系统能力-窗口管理的学习(3.2)

一、 知识储备

1. 基本概念

  • 窗口渲染式能力:指对状态栏、导航栏等系统窗口进行控制,减少状态栏、导航栏等系统界面的突兀感,从而使用户获得更好的体验。
    渲染式能力只在应用主窗口作为全屏窗口时生效,通常情况下,应用子窗口(弹窗、悬浮窗口等辅助窗口)无法使用沉浸式能力
  • 悬浮窗:全局悬浮窗口是一种特殊的应用窗口,具备在应用主窗口和对应Ability退到后台后,仍然可以在前台显示的能力。
    悬浮窗口可以用于应用退到后台后,使用小窗继续播放视频、或者为特定的应用创建悬浮球等快速入口。应用在创建悬浮窗口前,需要申请对应的权限(ohos.permission.SYSTEM_FLOAT_WINDOW)。

2.使用场景

  • 设置应用主窗口属性及目标页面
    在Stage模型下,应用主窗口由UIAbility创建并维护其生命周期。在UIAbility的onWindowStageCreate回调中,获取WindowStage,即可对其进行属性设置,也可以在应用配置文件中设置应用主窗口的属性。

  createMainWindow(windowStage: window.WindowStage) {

    //第一步:获取应用主窗口
    let windowClazz = null;
    windowStage.getMainWindow((err, data) => {
      if (err) {
        console.error('该设备不支持')
        return;
      }
      windowClazz = data;

      //第二步:设置主窗口属性
      let isTouchable = true;
      windowClazz.setWindowTouchable(isTouchable, (err) => {
        if (err) {
          console.error('不支持触摸')
          return;
        }

      })

      //第三步:为主窗口加载对应的目标页面
      windowStage.loadContent("pages/StudyWidget", err => {
        if (err.code) {
          console.error('响应失败')
          return;
        }
      })
    })
  }
  • 设置应用子窗口属性及目标页面

  createSubWindow(windowStage: window.WindowStage) {
    windowStage.createSubWindow('mySubWindow', (err, data) => { //1. 获取创建子窗口
      if (err) {
        console.error('不支持子窗口')
        return;
      }
      windowClazz = data;
    })

    windowClazz.moveWindowTo(300, 300, err => { //2. 设置子窗口属性
      if (err) {
        console.error('不支持子窗口移动')
        return;
      }
    })

    windowClazz.resize(500, 500, err => { //3. 修改子窗口属性
      if (err.code) {
        console.error('不支持子窗口改变尺寸')
      }
    })

    windowClazz.setUIContent('pages/StudyLayout', err => { //4. 加载对应的目标页面
      if (err.code) {
        console.error('子窗口加载页面失败')
        return;
      }
      windowClazz.showWindow(err => {
        if (err.code) {
          console.error('子窗口页面显示失败')
          return;
        }
      })
    })
  }

  destroySubWindow() {
    windowClazz.destroyWindow(err => {
      if (err.code) {
        console.error('子窗口销毁失败')
        return;
      }
    })

  }
  • 体验窗口沉浸式能力

  setupWindow(windowStage: window.WindowStage) {
    let windowClazz = null;

    windowStage.getMainWindow((err, data) => {
      if (err.code) {
        console.error(`${JSON.stringify(err)}`)
        return;
      }
      windowClazz = data;

      let names = [];
      windowClazz.setWindowSystemBarEnable(names, err => {
        if (err.code) {
          console.error(`${JSON.stringify(err)}`)
          return;
        }
      })
    })

    windowStage.loadContent('pages/StudyWidget', err => {
      if (err.code) {
        console.error(`${JSON.stringify(err)}`)
        return;
      }
    })

  }
  • 设置悬浮窗口

  addFloatWindow(windowStage: window.WindowStage) {

    let windowClazz = null;

    let config = {
      name: 'floatWindow', windowType: window.WindowType.TYPE_FLOAT, ctx: this.context
    };
    window.createWindow(config, (err, data) => {
      if (err.code) {
        console.error(`不支持:${JSON.stringify(err)}`)
        return;
      }
      windowClazz = data;

      windowClazz.moveWindowTo(300,300,err=>{
        if (err.code) {
          console.error(JSON.stringify(err))
          return;
        }
      })

      windowClazz.resize(500,500,err =>{
        if (err.code) {
          console.error(JSON.stringify(err))
          return;
        }
      })

      windowClazz.setUIContent("pages/StudyWidget",err=>{
        if (err.code) {
          console.error(JSON.stringify(err))
          return;
        }
        windowClazz.showWindow(err=>{
          if (err.code) {
            console.error(JSON.stringify(err));
            return;
          }
        })
      })
    })

  }

二、 效果一览

三、源码剖析

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';
import thermal from '@ohos.thermal';

let windowClazz = null;

export default class EntryAbility extends UIAbility {
  onCreate(want, launchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', '我被创建了');
    globalThis.initTitle = '我是测试标题'
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', '我被销毁了');
  }

  /*****************在这里定义LocalStorage*****************/
  args: Record<string, Object> = {
    'height': 111, 'age': 10, 'name': '小明', sex: '未知'
  };
  storage: LocalStorage = new LocalStorage(this.args)

  onWindowStageCreate(windowStage: window.WindowStage) {
    hilog.info(0x0000, 'testTag', '%{public}s', '系统接管创建');
    // windowStage.loadContent('pages/event/EventStudy', this.storage) //把localStorage实例传递过去
    windowStage.loadContent('pages/manager/NotificationIndex', this.storage) //把localStorage实例传递过去

    // this.createMainWindow(windowStage)
    // this.createSubWindow(windowStage)

    // this.setupWindow(windowStage)

    this.addFloatWindow(windowStage)
  }
  /*****************在这里定义LocalStorage*****************/

  onWindowStageDestroy() {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', '系统接管销毁');
    this.destroySubWindow();
  }

  onForeground() {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', '我要可见了');
  }

  onBackground() {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', '我不可见了');
  }

  createSubWindow(windowStage: window.WindowStage) {
    windowStage.createSubWindow('mySubWindow', (err, data) => { //1. 获取创建子窗口
      if (err) {
        console.error('不支持子窗口')
        return;
      }
      windowClazz = data;
    })

    windowClazz.moveWindowTo(300, 300, err => { //2. 设置子窗口属性
      if (err) {
        console.error('不支持子窗口移动')
        return;
      }
    })

    windowClazz.resize(500, 500, err => { //3. 修改子窗口属性
      if (err.code) {
        console.error('不支持子窗口改变尺寸')
      }
    })

    windowClazz.setUIContent('pages/StudyLayout', err => { //4. 加载对应的目标页面
      if (err.code) {
        console.error('子窗口加载页面失败')
        return;
      }
      windowClazz.showWindow(err => {
        if (err.code) {
          console.error('子窗口页面显示失败')
          return;
        }
      })
    })
  }

  destroySubWindow() {
    windowClazz.destroyWindow(err => {
      if (err.code) {
        console.error('子窗口销毁失败')
        return;
      }
    })

  }

  addFloatWindow(windowStage: window.WindowStage) {

    let windowClazz = null;

    let config = {
      name: 'floatWindow', windowType: window.WindowType.TYPE_FLOAT, ctx: this.context
    };
    window.createWindow(config, (err, data) => {
      if (err.code) {
        console.error(`不支持:${JSON.stringify(err)}`)
        return;
      }
      windowClazz = data;

      windowClazz.moveWindowTo(300,300,err=>{
        if (err.code) {
          console.error(JSON.stringify(err))
          return;
        }
      })

      windowClazz.resize(500,500,err =>{
        if (err.code) {
          console.error(JSON.stringify(err))
          return;
        }
      })

      windowClazz.setUIContent("pages/StudyWidget",err=>{
        if (err.code) {
          console.error(JSON.stringify(err))
          return;
        }
        windowClazz.showWindow(err=>{
          if (err.code) {
            console.error(JSON.stringify(err));
            return;
          }
        })
      })
    })

  }

  setupWindow(windowStage: window.WindowStage) {
    let windowClazz = null;

    windowStage.getMainWindow((err, data) => {
      if (err.code) {
        console.error(`${JSON.stringify(err)}`)
        return;
      }
      windowClazz = data;

      let names = [];
      windowClazz.setWindowSystemBarEnable(names, err => {
        if (err.code) {
          console.error(`${JSON.stringify(err)}`)
          return;
        }
      })
    })

    windowStage.loadContent('pages/StudyWidget', err => {
      if (err.code) {
        console.error(`${JSON.stringify(err)}`)
        return;
      }
    })

  }

  createMainWindow(windowStage: window.WindowStage) {

    //第一步:获取应用主窗口
    let windowClazz = null;
    windowStage.getMainWindow((err, data) => {
      if (err) {
        console.error('该设备不支持')
        return;
      }
      windowClazz = data;

      //第二步:设置主窗口属性
      let isTouchable = true;
      windowClazz.setWindowTouchable(isTouchable, (err) => {
        if (err) {
          console.error('不支持触摸')
          return;
        }

      })

      //第三步:为主窗口加载对应的目标页面
      windowStage.loadContent("pages/StudyWidget", err => {
        if (err.code) {
          console.error('响应失败')
          return;
        }
      })
    })
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1884026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring底层原理之bean的加载方式四 @import 注解

bean的加载方式四 import 第四种bean的导入方式 是import导入的方式 在配置类上面加上注解就行 package com.bigdata1421.config;import com.bigdata1421.bean.Dog; import org.springframework.context.annotation.Import;Import(Dog.class) public class SpringConfig4 {…

直播的js代码debug解析找到protobuf消息的定义

我们都知道直播的弹幕消息是通过websocket发送的&#xff0c;而且是通过protobuf传输的&#xff0c;那么这里面传输了哪些内容&#xff0c;这个proto文件又要怎么定义&#xff1f;每个消息叫什么&#xff0c;消息里面又包含有哪些字段&#xff0c;每个字段又是什么类型&#xf…

1-3.文本数据建模流程范例

文章最前&#xff1a; 我是Octopus&#xff0c;这个名字来源于我的中文名–章鱼&#xff1b;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github &#xff1b;这博客是记录我学习的点点滴滴&#xff0c;如果您对 Python、Java、AI、算法有兴趣&#xff0c;可以关注我的…

# [0701] Task05 策略梯度、Actor-critic 算法

easy-rl PDF版本 笔记整理 P4、P9 joyrl 比对 补充 P9 - P10 相关 代码 整理 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh83Vs0kbw 提取码: us…

LeetCode中MySQL题目 176.第二高的薪水

题目图片&#xff1a; 题目解答&#xff1a; SELECTIFNULL((SELECT DISTINCT SalaryFROM EmployeeORDER BY Salary DESCLIMIT 1 OFFSET 1),NULL) AS SecondHighestSalary解答解析&#xff1a; 就是用了一个叫做IFNULL的函数进行判断&#xff0c;如果查找出来的内容为空&…

信息系统的安全模型

1. 信息系统的安全目标 信息系统的安全目标是控制和管理主体&#xff08;含用户和进程&#xff09;对客体&#xff08;含数据和程序&#xff09;的访问。作为信息系统安全目标&#xff0c;就是要实现&#xff1a; 保护信息系统的可用性&#xff1b; 保护网络系统服务的…

第1章 人工智能的基础概念与应用导论

亲爱的读者朋友们&#xff0c;你们好&#xff01;欢迎来到这个充满神奇与奥秘的人工智能世界。我知道&#xff0c;对于很多人来说&#xff0c;人工智能&#xff08;AI&#xff09;可能是个既神秘又高大上的词汇&#xff0c;仿佛遥不可及&#xff0c;只存在于科幻电影或者顶级科…

大数据学习之Clickhouse

Clickhouse-23.2.1.2537 学习 一、Clickhouse概述 clickhouse 官网网址&#xff1a;https://clickhouse.com/ ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 OLTP(联机事务处理系统)例如mysql等关系型数据库&#xff0c;在对于存储小数据量的时候&#xff…

Linux内核——Linux内核体系模式(二)

1 Linux系统的中断机制 Linux内核将中断分为两类&#xff1a;硬件中断和软件中断&#xff08;异常&#xff09;。每个中断是由0-255之间的一个数字进行标识。 中断int0-int31&#xff08;0x00-0x1f&#xff09;作为异常int32-int255由用户自己设定 int32-int47对应与8259A中断…

怎么永久禁止win10系统自动更新?一键屏蔽系统自动更新

现在 Windows 10 系统是很多办公用户的主力操作系统&#xff0c;可是 Windows 系统会自动更新&#xff0c;这会严重影响系统稳定性。因为微软虽然以提供更新为服务&#xff0c;但并不是每次更新它都是安全的。 接下来和我一起看看如何使用联想开发的小工具一键屏蔽系统自动更新…

数据库定义语言(DDL)

数据库定义语言&#xff08;DDL&#xff09; 一、数据库操作 1、 查询所有的数据库 SHOW DATABASES;效果截图&#xff1a; 2、使用指定的数据库 use 2403 2403javaee;效果截图&#xff1a; 3、创建数据库 CREATE DATABASE 2404javaee;效果截图&#xff1a; 4、删除数据…

Datax快速使用之牛刀小试

前言 一次我发现业务他们在用 datax数据同步工具&#xff0c;我尤记得曾经 19 年使用过&#xff0c;并且基于当时的版本还修复了个 BUG并且做了数据同步管道的集成开发。没想到时间过的飞快&#xff0c;业务方基于海豚调度 2.0.6 的版本中有在使用&#xff0c;由于业务方还没有…

光伏设计的原则和必备要素

光伏设计是一项复杂的工程任务&#xff0c;它涉及到将太阳能转换为电能的过程&#xff0c;并在各种环境条件下确保系统的稳定、高效运行。以下是光伏设计应遵循的原则和必备的要素。 一、光伏设计的原则 1、最大化能量产出&#xff1a;光伏设计的首要原则是通过合理的布局和选…

RedHat9 | 内部YUM本地源服务器搭建

服务器参数 标识公司内部YUM服务器主机名yum-server网络信息192.168.37.1/24网络属性静态地址主要操作用户root 一、基础环境信息配置 修改主机名 [rootyum-server ~]# hostnamectl hostname yum-server添加网络信息 [rootyum-server ~]# nmcli connection modify ens160 …

Python和tkinter单词游戏

Python和tkinter单词游戏 数据字典文本文件&#xff0c;文件名为Dictionary.txt&#xff0c;保存编码格式为&#xff1a;utf-8。文本内容&#xff1a;每行一个 单词 &#xff0c;单词和解释用空格分隔&#xff0c;如 a art.一(个)&#xff1b;每一(个) ability n.能力&#…

EKF+UKF+CKF+PF的效果对比|三维非线性滤波|MATLAB例程

前言 标题里的EKF、UKF、CKF、PF分别为&#xff1a;扩展卡尔曼滤波、无迹卡尔曼滤波、容积卡尔曼滤波、粒子滤波。 EKF是扩展卡尔曼滤波&#xff0c;计算快&#xff0c;最常用于非线性状态方程或观测方程下的卡尔曼滤波。 但是EKF应对强非线性的系统时&#xff0c;估计效果不如…

MySQL5.7安装初始化错误解决方案

问题背景 今天在给公司配数据库环境时,第一次报initializing database 数据库初始化错误? 起初没管以为是安装软件原因,然后就出现以下错误:如下图 点开log,我们观察日志会发现 无法识别的参数 ‘mysqlx_port=0.0’,???,官方的安装程序还能出这问题?

排序(堆排序、快速排序、归并排序)-->深度剖析(二)

前言 前面介绍了冒泡排序、选择排序、插入排序、希尔排序&#xff0c;作为排序中经常用到了算法&#xff0c;还有堆排序、快速排序、归并排序 堆排序&#xff08;HeaSort&#xff09; 堆排序的概念 堆排序是一种有效的排序算法&#xff0c;它利用了完全二叉树的特性。在C语言…

【Linux】:环境变量

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux环境变量的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门…

万字总结随机森林原理、核心参数以及调优思路

万字总结随机森林原理、核心参数以及调优思路 在机器学习的世界里&#xff0c;随机森林&#xff08;Random Forest, RF&#xff09;以其强大的预测能力和对数据集的鲁棒性而备受青睐。作为一种集成学习方法&#xff0c;随机森林通过构建多个决策树并将它们的预测结果进行汇总&…