鸿蒙实战开发:【浏览器制作】

浏览器

介绍

本示例使用[@ohos.systemparameter]接口和[Web组件]展示了一个浏览器的基本功能,展示网页,根据页面历史栈前进回退等。

效果预览

首页打开网址

使用说明:

  1. 连接Wifi,启动应用,展示默认页面内容;
  2. 点击默认页面的图标跳转到对应网页,或者在输入框输入网址,点击右侧跳转按钮跳转到对应网页;
  3. 点击输入框左侧向右向左按钮进行页面的前进后退;
  4. 点击主页图标回到主页,点击加号按钮新建一个页面。

工程目录

entry/src/main/ets/
|---Application
|   |---AbilityStage.ets                        // 入口
|---pages
|   |---Index.ets                               // 首页
|---common
|   |---PhoneLayout.ets                         // 窗口管理工具
|   |---TitleBar.ets                            // 导航栏
|---model
|   |---Logger.ts                               // 日志工具
|   |---Browser.ets                             // 浏览器实例

具体实现

  • Web展示与历史栈操作功能在Browser中,源码参考[Browser.ets]
/** Copyright (c) 2022 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import Logger from './Logger'import prompt from '@ohos.prompt';export class WebObject {controller: WebController;isRegistered: boolean;constructor(controller: WebController, isRegistered: boolean) {this.controller = controllerthis.isRegistered = isRegistered}}@Observedclass WebKey {key: number;timestamp: number;constructor(key: number, timestamp: number) {this.key = keythis.timestamp = timestamp}}export enum LoadingStatus {LOADING,END}const TAG: string = '[browser]'export class Browser {inputValue: string = ""tabArrayIndex: number = 0progress: number = 0hideProgress: boolean = trueloadingStatus: LoadingStatus = LoadingStatus.ENDwebArray: Array<WebKey> = [new WebKey(0, new Date().getTime())]tabsController: TabsController = new TabsController()webControllerArray: Array<WebObject> = [new WebObject(new WebController(), false)]deleteTab(index: number) {Logger.info(TAG, `delete before tab index= ${index} controller length ${this.webControllerArray.length} tabArrayIndex= ${this.tabArrayIndex}`)this.webArray.splice(index, 1)this.webControllerArray.splice(index, 1)if (this.tabArrayIndex > index || this.tabArrayIndex === this.webArray.length) {this.tabArrayIndex -= 1}for (let i = index;i < this.webArray.length; ++i) {this.webArray[i].key -= 1}for (let i = 0;i < this.webArray.length; ++i) {Logger.info(TAG, `key ${this.webArray[i].key}, time=${this.webArray[i].timestamp}`)}Logger.info(`delete after tab index=${index}, controller length=${this.webControllerArray.length}, tabArrayIndex=${this.tabArrayIndex}`)this.tabsController.changeIndex(this.tabArrayIndex)}getWebArray() {return this.webArray}addTab() {if (this.webArray.length > 10) {prompt.showToast({message: '页签数量已满'})return;}let webController: WebController = new WebController();let object = new WebObject(webController, false)this.webControllerArray.push(object)this.webArray.push(new WebKey(this.webArray.length, new Date().getTime()))this.tabArrayIndex = this.webArray.length - 1Logger.info(TAG, `add tab index= ${this.tabArrayIndex}`)setTimeout(() => {this.tabsController.changeIndex(this.tabArrayIndex)}, 50)}setTabArrayIndex(tabArrayIndex: number) {this.tabArrayIndex = tabArrayIndex}getTabArrayIndex() {return this.tabArrayIndex}setInputVal(inputValue: string) {this.inputValue = inputValue}getInputVal() {return this.inputValue}loadUrl(addr: string) {addr = "https://" + addr;this.webControllerArray[this.tabArrayIndex].controller.loadUrl({ url: addr })}Back() {if (this.webControllerArray[this.tabArrayIndex].controller.accessBackward()) {this.webControllerArray[this.tabArrayIndex].controller.backward()}}Forward() {if (this.webControllerArray[this.tabArrayIndex].controller.accessForward()) {this.webControllerArray[this.tabArrayIndex].controller.forward()}}Refresh() {this.webControllerArray[this.tabArrayIndex].controller.refresh()}}
-   加载网页及刷新:使用WebController提供的loadUrl可以加载目标网址内容,使用refresh方法刷新页面;
-   页面前进后退功能:页面在前进或者后退前使用accessForward/accessBackward查询是否有历史记录,然后调用forward/backward进行前进/后退操作。

依赖

不涉及。

约束与限制

  1. 本示例仅支持标准系统上运行;
  2. 本示例需外接鼠标进行验证;
  3. 本示例已适配API version 9版本SDK,版本号:3.2.11.9。
  4. 本示例不支持点击tab页签,切换网页并刷新页面;
  5. 本示例涉及使用系统接口:[@ohos.systemparameter],需要手动替换Full SDK才能编译通过。
  6. 本示例需要使用DevEco Studio 3.1 Beta2 (Build Version: 3.1.0.400, built on April 7, 2023)及以上版本才可编译运行。

下载

如需单独下载本工程,执行如下命令:

git init
git config core.sparsecheckout true
echo code/BasicFeature/Web/Browser/ > .git/info/sparse-checkout
git remote add origin https://gitee.com/openharmony/applications_app_samples.git
git pull origin master

更多鸿蒙知识已经更新qr23.cn/AKFP8k可以前往了解

HarmonyOS与OpenHarmony技术路线曲线图1.png

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

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

相关文章

C语言经典算法-7

文章目录 其他经典例题跳转链接36.排序法 - 改良的选择排序37.快速排序法&#xff08;一&#xff09;38.快速排序法&#xff08;二&#xff09;39.快速排序法&#xff08;三&#xff09;40.合并排序法 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三…

AnyGo for Mac最新激活版:位置模拟软件打破地域限制

AnyGo for Mac&#xff0c;一款专为Mac用户打造的位置模拟软件&#xff0c;让您能够轻松打破地域限制&#xff0c;畅享无限可能。 软件下载&#xff1a;AnyGo for Mac v7.0.0最新激活版 通过AnyGo&#xff0c;您可以随时随地模拟出任何地理位置&#xff0c;无论是国内热门景点还…

(三)pulsar可视化消息管理工具

官网&#xff1a;https://pulsar.apache.org/docs/3.2.x/administration-pulsar-manager/ 版本: 3.2.x 安装和配置 拉取容器 docker pull apachepulsar/pulsar-manager:v0.3.0运行容器&#xff1a; # pulsar消息管理工具 CURRENT_DIR$(cd dirname $0; pwd) BASE_DIR$(cd $(…

【07】进阶html5

HTML5 包含两个部分的更新,分别是文档和web api 文档 HTML5 元素表 元素语义化 元素语义化是指每个 HTML 元素都代表着某种含义,在开发中应该根据元素含义选择元素 元素语义化的好处: 利于 SEO(搜索引擎优化)利于无障碍访问利于浏览器的插件分析网页新增元素 多媒体…

手撕算法-判断是不是完全二叉树

描述&#xff1a;思路&#xff1a;采用层序遍历&#xff0c;找到一个为空的标记&#xff0c;如果后面还有值&#xff0c;就代表不是完全二叉树。代码&#xff1a; public boolean isCompleteTree (TreeNode root) {// write code hereif(root null) return true;Queue<Tree…

Go语言学习13-常见软件架构的实现

Go语言学习13-常见软件架构的实现 架构模式 An architectural pattern is a general, reusable solution to a commonly occurring problem in software architectural within a given context. ——wikipedia Pipe-Filter 架构 Pipe-Filter 模式 非常适合于数据处理及数据分…

[Qt学习笔记]Qt下使用Halcon实现采图时自动对焦的功能(Brenner梯度法)

目录 1、介绍2、实现方法2.1 算法实现过程2.2 模拟采集流程 3、总结4、代码展示 1、介绍 在机器视觉的开发中&#xff0c;现在有很多通过电机去做相机的聚焦调节&#xff0c;对比手工调节&#xff0c;自动调节效果更好&#xff0c;而且其也能满足设备自动的需求&#xff0c;尤…

HCIA ——VLAN实验

一 、 实验需求 1.PC1和PC3所在接口为access接口&#xff1b;属于vlan 2 PC2-4-5-6处于同一网段&#xff1b;其中PC2可以访问PC4-5-6 PC4可以访问PC5不能访问PC6 PC5不能访问PC6 3.PC1-PC3与PC2-4-5-6不在同一个网段 4.所有PC均使用DHCP获取IP地址&#xff0c;且PC1可以正常访问…

mysql之基本概念与安装

一 数据库的基本概念 1.1 数据 记录个体的信息 1.2 表 存放信息的集合&#xff0c;行于与列 1.3 数据库 数据库就是表的集合。它是以一定的组织方式存储的相互有关的数据集合 1.4 数据库管理系统 数据库管理系统&#xff08;DatabaseManagementSystem&#xff0c;DBMS&…

Flutter 初始WidgetState 简单应用案例分析

本系列文章主要整理Flutter的知识汇总&#xff0c;由浅入深&#xff0c;从Widget的搭建到其中的原理。本文还是围绕Widget在开发中应用和理解。 关于Flutter环境配置和首次创建可以参考前面文章。链接如下&#xff1a; Flutter 安装部署与认识Dart语言 Flutter 使用AndroidS…

MySQL 搭建双主复制服务 并 通过 HAProxy 负载均衡

一、MySQL 搭建双主复制高可用服务 在数据库管理中&#xff0c;数据的备份和同步是至关重要的环节&#xff0c;而双主复制&#xff08;Dual Master Replication&#xff09;作为一种高可用性和数据同步的解决方案&#xff0c;通过让两个数据库实例同时充当主服务器和从服务器&…

Tomcat(Win+Linux)安装教程

Windows环境安装 Tomcat安装及配置教程主要分为四步&#xff1a; 步骤一&#xff1a;确认自己是否已 安装JDK&#x1f50d; 步骤二&#xff1a;下载安装Tomcat 步骤三&#xff1a;Tomcat配置环境变量 步骤四&#xff1a;验证Tomcat配置是否成功 OK&#xff0c;我们开始&#x…

python 中 float 和 decimal 的区别

decimal --- 十进制定点和浮点运算 — Python 3.11.8 文档请参考官方说明文档&#xff1a; decimal --- 十进制定点和浮点运算 — Python 3.11.8 文档 举例&#xff1a; # 使用 Decimal 类型进行计算 from decimal import Decimaltotal_float 0.1 0.2 total_decimal Decim…

CMU 10-414/714: Deep Learning Systems --hw3

实现功能 在ndarray.py文件中完成一些python array操作 我们实现的NDArray底层存储就是一个一维向量&#xff0c;只不过会有一些额外的属性&#xff08;如shape、strides&#xff09;来表明这个flat array在维度上的分布。底层运算&#xff08;如加法、矩阵乘法&#xff09;都…

[LeetCode][LCR170]交易逆序对的总数

题目 LCR 170. 交易逆序对的总数 在股票交易中&#xff0c;如果前一天的股价高于后一天的股价&#xff0c;则可以认为存在一个「交易逆序对」。请设计一个程序&#xff0c;输入一段时间内的股票交易记录 record&#xff0c;返回其中存在的「交易逆序对」总数。 示例 1&#xf…

【VUE】前端阿里云OSS断点续传,分片上传

什么是OSS&#xff1a; 数据以对象&#xff08;Object&#xff09;的形式存储在OSS的存储空间&#xff08;Bucket &#xff09;中。如果要使用OSS存储数据&#xff0c;您需要先创建Bucket&#xff0c;并指定Bucket的地域、访问权限、存储类型等属性。创建Bucket后&#xff0c;您…

React - 实现菜单栏滚动

简介 本文将会基于react实现滚动菜单栏功能。 技术实现 实现效果 点击菜单&#xff0c;内容区域会自动滚动到对应卡片。内容区域滑动&#xff0c;指定菜单栏会被选中。 ScrollMenu.js import {useRef, useState} from "react"; import ./ScrollMenu.css;export co…

线程和进程的区别和联系

一、什么是进程 进程(Process), 是一个具有独立功能的程序关于某个数据集合的一次运行活动&#xff0c;是系统进行 【资源分配和调度】 的一个独立单位。 进程是【程序】的【一次执行】(是计算机中程序的执行过程&#xff0c;而不是计算机中的程序)进程是系统进行【资源分配和…

[LeetBook]【学习日记】排序算法——归并排序

主要思想 归并排序是一种分治算法&#xff0c;其排序过程包括分和治分是指将要排序的序列一分为二、二分为四&#xff0c;直到单个序列中只有一个数治是指在分完后&#xff0c;将每两个元素重新组合&#xff0c;四合为二、二合为一&#xff0c;最终完成排序 图片作者&#xf…

Gitlab部署及使用

1. 简介 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用 Git 作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。Gitlab是目前被广泛使用的基于 git 的开源代码管理平台&#xff0c;基于Ruby on Rails构建&#xff0c;主要针对软件开发过程中产生的代码…