ArkTS-取消标题与自定义标题栏

news2025/1/20 10:50:04

文章目录

      • 取消标头
      • 自定义标题栏
      • 导入Resources
      • 自定义跳转动画
      • 关于底部tabBar导航
      • 文本输入(TextInput/TextArea)
        • 自定义样式
        • 添加事件
          • 可以是`onChange`
          • 可以是`onSubmit`
      • List列表组件
        • 设置主轴方向
      • 网格布局
      • 服务卡片-获取地理位置
        • 页面获取地理位置
        • 服务卡片获取地理位置

可以先看看,但是自己还没到达这高度(openHarmony的内容)

取消标头

//config.json(ets)
{
  //...
  "abilities": [
      {
		//...
        "metaData": { //添加这一段
          "customizeData": [{
            "name": "hwc-theme",
            "value": "androidhwext:style/Theme.Emui.Light.NoTitleBar",
            "extra": ""
          }]
        }
      }
    ],
  
}

在这里插入图片描述

自定义标题栏

因为是使用的是Components组件所以要使用@Props但这是单向的,父传子,可以使用@Link父子双向传输这里还是使用@Props就可以了

src/main/ets/MainAbility/components/组件名.ets

@Component
export struct CommonTitleBar{
  @Prop user_name:string;
  build(){
    Row(){
      Row(){
        Text(`${this.user_name}`).fontSize(25).fontColor('#f00')
      }.width('100%').height('8%').backgroundColor('#0ff')
    }.width('100%')
  }
}

src/main/ets/MainAbility/pages/组件名.ets

import {CommonTitleBar} from "../components/CommonTitleBar"

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  public attribute: CommonTitleBar;
  @State text:string = "测试"
  build() {
    Row(){
      CommonTitleBar({user_name:this.text}) //值传入
    }
  }
}

在这里插入图片描述

导入Resources

这里以HarmonyOS的Image为例子
在这里插入图片描述
这里以media为例子----Image组件

Image($r('app.media.user_default')).width('20%').height('80%')

如果是rawfile文档里也有说明

Image($rawfile('图片名'))

注意: 这里的图片类型都是png,如果不是png格式的图片并且出现问题,请另找文章

自定义跳转动画

是基于ohos.router的跳转来测试的
官方文档

@Entry
@Component
struct myPage{
  build(){
    Column(){
      //components...
    }.height('100%')
  }
  
  pageTransition() {
    PageTransitionEnter({  })
      .onEnter((type: RouteType, progress: number) => {

      })
    PageTransitionExit({  })
      .onExit((type: RouteType, progress: number) => {

      })
  }
}

当然你可以写很多专场特效,如果你向我上面示例一样什么都不写,则是没有跳转动画的(注:输入pageT会有代码提示,注意区分)

关于底部tabBar导航

在这里插入图片描述

就是一个组件,只不过上面的俩组件的大小刚刚好让这个组件在最下面,但是要进行状态的同步,应该是要使用上面提到过的@Link组件

import router from '@ohos.router';
@Component
export struct BottomTabBar{
  @Prop backColor:string

  @Prop Dialog1Name:string;
  @Prop Dialog1Page:string;
  @Prop isDialog1Btn:boolean;
  @Link Dialog1BackColor:string;

  @Prop Dialog2Name:string;
  @Prop Dialog2Page:string;
  @Link Dialog2BackColor:string;
  @Prop isDialog2Btn:boolean;


  build(){
    Row(){
      Column(){
        if(this.isDialog1Btn == true){
          Image($r('app.media.home_selected')).width(30).height(30).position({x:15,y:-30})
        }else if(this.isDialog2Btn == true){
          Image($r('app.media.home')).width(30).height(30).position({x:15,y:-30})
        }
        Text(this.Dialog1Name).fontSize(10).fontColor(this.Dialog1BackColor).position({x:20,y:10})
      }.height('100%').onClick(()=>{
        router.replace({
          url: this.Dialog1Page
        })
      })
      Column(){
        if(this.isDialog1Btn == true){
          Image($r('app.media.my')).width(30).height(30).position({x:295,y:-52})
        }else if(this.isDialog2Btn == true){
          Image($r('app.media.my_selected')).width(30).height(30).position({x:295,y:-52})
        }
        Text(this.Dialog2Name).fontSize(10).fontColor(this.Dialog2BackColor).position({x:300,y:-11})
      }.onClick(()=>{
        router.replace({
          url: this.Dialog2Page
        })
      })
    }.width("100%").height('6%').backgroundColor(this.backColor)
  }
}

这样写可以以假乱真
在这里插入图片描述

当然如果不想要这么麻烦可以使用TabContent其中涉及到了Tabs

build(){
    Row(){
      Tabs({barPosition:BarPosition.Start,controller: this.controller}){
        TabContent(){
          Column(){
            Text("首页").fontSize(32)
          }.width('100%').height('100%').backgroundColor(Color.Pink)
        }
        TabContent(){
          Column(){
            Text("我的").fontSize(32)
          }.width('100%').height('100%').backgroundColor(Color.Pink)
        }
        TabContent(){
          Column(){}
        }
      }
    }.width("100%").height('6%')

在这里插入图片描述

// import router from '@ohos.router';



@Component
export struct BottomTabBar{
  @Prop backColor:string

  @State currentIndex:number = 0;
  @State fontColor: string = 'rgba(0, 0, 0, 0.4)'
  @State selectedFontColor: string = 'rgba(10, 30, 255, 1)'

  @State Tab1Name:string = "首页"
  @State Tab2Name:string = "我的"

  private controller: TabsController = new TabsController()

  @Builder TabBuilder(index: number,ImageUrl:Resource,ImageUrl_Selected:Resource,TabName:string) {
    Column() {
      Image(this.currentIndex === index ? ImageUrl_Selected : ImageUrl)
        .width(24)
        .height(24)
        .margin(6)
        .opacity(this.currentIndex === index ? 1 : 0.4)
        .objectFit(ImageFit.Contain)
      Text(`${TabName}`)
        .fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor)
        .fontSize(10)
    }.width('100%')
  }

  build() {
    Row() {
      Tabs({ barPosition: BarPosition.End, controller: this.controller }) {
        TabContent() {
          Column() {
            Text("首页").fontSize(32)
          }.width('100%').height('100%').backgroundColor(Color.Pink)
        }.tabBar(this.TabBuilder(0, $r('app.media.home'), $r('app.media.home_selected'),this.Tab1Name))

        TabContent() {
          Column() {
            Text("我的").fontSize(32)
          }.width('100%').height('100%').backgroundColor(Color.Pink)
        }.tabBar(this.TabBuilder(1, $r('app.media.my'), $r('app.media.my_selected'),this.Tab2Name))
      }
    }.width("100%").height('6%').backgroundColor(this.backColor)
  }
}

在这里插入图片描述

文本输入(TextInput/TextArea)

我们这里使用单行输入(TextInput) 你也可以使用多行输入(TextArea)

基础的TextInput

TextInput().width(200).height(25).margin({top:10,left:30,right:0,bottom:10})

确认TextInput类型

TextInput().type(InputType.Normal)//可以是TextInput().type(InputType.Password)
自定义样式
TextInput({placeholder:'陈天羽'}).type(InputType.Normal)

在这里插入图片描述

可以请提前输入文本

TextInput({placeholder:'陈天羽',text:'你好'}).type(InputType.Normal)

可以改变TextInput背景颜色

TextInput({placeholder:'陈天羽'}).type(InputType.Normal).backgroundColor(Color.Pink)
添加事件
TextInput()
  .onChange((value: string) => {
    console.info(value);
  })
  .onFocus(() => {
    console.info('获取焦点');
  })
可以是onChange
TextInput({placeholder:'陈天羽'}).type(InputType.Normal).width(200).height(25).margin({top:10,left:30,right:0,bottom:10})
          .onChange((value:string)=>{
            console.info('TextInput:'+value);
          })

以下图片是键盘输入而获取输入内容,点击一个键,则更新一个内容
在这里插入图片描述
在这里插入图片描述

可以是onSubmit
TextInput({placeholder:'陈天羽'}).type(InputType.Normal)
	.width(200)
	.height(25)
	.margin({top:10,left:30,right:0,bottom:10})
	
	.onSubmit((EnterKeyType)=>{
		console.info(EnterKeyType+'输入法回车键的类型值')
	})

下图时按下手机键盘上的确认按键
在这里插入图片描述

List列表组件

设置主轴方向

我这里设置的是Horizontal

List(){
    ListItem(){
    	Text('推荐').fontSize(15).margin({top:0,left:10,right:10,bottom:0})
    }
    ListItem(){
    	Text('动画').fontSize(15).margin({top:0,left:10,right:10,bottom:0})
	}
}.listDirection(Axis.Horizontal).width('100%').height('8%')

在这里插入图片描述

网格布局

Grid(){
        GridItem(){
          Text("1").width('100%').height('100%').backgroundColor('#f00')
        }
        GridItem(){
          Text("2").width('100%').height('100%').backgroundColor('#f0f')
        }
        GridItem(){
          Text("3").width('100%').height('100%').backgroundColor('#0f0')
        }
        GridItem(){
          Text("4").width('100%').height('100%').backgroundColor('#00f')
        }
        GridItem(){
          Text("5").width('100%').height('100%').backgroundColor('#0ff') //当然超出的部分是没有显示的
		}
	}.rowsTemplate('1fr 1fr').columnsTemplate('1fr 1fr')
}.width('100%').height('86%').backgroundColor('#eee')

在这里插入图片描述

服务卡片-获取地理位置

首先我们要确认怎么用ets获取自己的地理位置官方文档-获取设备的位置信息

页面获取地理位置
  1. 首先我们要获取使用权限
"reqPermissions": [
      {
        "name": "ohos.permission.LOCATION",
        "reason": "$string:reason_description", 
        "usedScene": {
          "ability": ["com.example.myzdytitletest.MainAbility"],
          "when": "inuse"
        }
      }
    ]

这里的$string:reason_description在三个string.json中定义

//base/string.json
{
	"name":"reason_description",
	"value": "get Local"
}
//en_US/string.json
{
	"name":"reason_description",
	"value": "get Local"
}
//zh_CN/string.json
{
	"name":"reason_description",
	"value": "获取地理位置"
}
  1. 在其中一个组件中定义(这里我们选择初始化的第一个页面Index.ets)
//...(其他components)
import geolocation from '@ohos.geolocation';

@Entry
@Component
struct Index{
  onPageShow(){
    //获取位置信息
    var requestInfo = {'priority': 0x201, 'timeInterval': 0, 'distanceInterval': 0, 'maxAccuracy': 0};
    var locationChange = (location) => {
      console.log('locationChanger: data: ' + JSON.stringify(location));
    };
    geolocation.on('locationChange', requestInfo, locationChange);
  }
}

结果图
在这里插入图片描述

这些都是获取到的地址信息
在这里插入图片描述
抓一串数据来看

app Log: locationChanger: data: {"accuracy":9.935046,"additionSize":0,"additions":"","altitude":33.40478515625,"direction":0,"isFromMock":false,"latitude":30.02292782,"longitude":119.97146259,"speed":0,"timeSinceBoot":2212104121975933,"timeStamp":1701249020000}

但是我们这样只知道坐标不知道具体位置,所以我们可以使用(逆)地理编码转化来推测出当前位置信息

  • 调用getAddressesFromLocation,坐标转化地理位置信息。
let reverseGeocodeRequest:geolocation.ReverseGeoCodeRequest = {"latitude": 31.12, "longitude": 121.11, "maxItems": 1};
geolocation.getAddressesFromLocation(reverseGeocodeRequest, (err,data) => {
    if (err) {
        console.log('getAddressesFromLocation: err=' + JSON.stringify(err));
    }
	if (data) {
    	console.log('getAddressesFromLocation: data=' + JSON.stringify(data));
	}
});

出现的数据是

getAddressesFromLocation: data=[{"addressUrl":"","administrativeArea":"上海市","countryCode":"CN","countryName":"中国","descriptions":["上海市青浦区金家村路上海龙鼎苗木培育中心"],"descriptionsSize":0,"isFromMock":false,"latitude":31.120929,"locale":"zh_CN","locality":"上海市","longitude":121.110896,"phoneNumber":"","placeName":"金家村路上海龙鼎苗木培育中心","postalCode":"","premises":"","roadName":"青昆路","subAdministrativeArea":"","subLocality":"青浦区","subRoadName":"755号"}]
  • 调用getAddressesFromLocationName位置描述转化坐标。
var geocodeRequest = {"description": "上海市青浦区金家村路上海龙鼎苗木培育中心", "maxItems": 1};
geolocation.getAddressesFromLocationName(geocodeRequest, (data) => {
    console.log('getAddressesFromLocationName: ' + JSON.stringify(data));
});

博主很菜,没有写出实时性获取地址+(逆)地理编码转化。有大佬可以进行拓展(注意以上都可以写在Pages的onPageShow生命周期钩子里)

服务卡片获取地理位置

服务卡片可以参考这一篇文章接下来我们就开始使用服务卡片获取地理位置

博主很菜,因为是json控制的关系,目前还没写出。。。可以开骂

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

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

相关文章

移民同步进行|企业高管自费赴美国奥本大学访学

K经理申请了美国杰出人才移民,已经获批I-140,正在排期中,尚未获得绿卡。为了使孩子同步美国学制,K经理希望先以访问学者身份带孩子出国接受免费公立教育。最终我们落实了奥本大学的职位,申请人及孩子顺利获签出国&…

VSCODE+QEMU+WSL调试RISCV代码(SBI、kernel)

前言 最近在对RISC-V架构比较感兴趣,正好手头有《RISC-V体系结构编程与实践》的书籍,就打算跟随笨叔将这块的知识学习起来,最开始当然是需要搭建一个基础的实验平台,本来笨叔是贴心的提供了VMare的环境,奈何天生叛逆的…

Matlab下载许可证文件 教程(在账号有许可证的前提下)

文章目录 Part.I IntroductionPart.II 许可证文件过期解决方案Chap.I 使用 Internet 自动激活Chap.II 在不使用 Internet 的情况下手动激活 Part.I Introduction 本文主要介绍,在 Mathwork 账号有许可证的前提下,下载许可证的操作流程。 好久没有用 Mat…

OSCP系列靶场-Esay-1

总结 getwebshell : ftp可匿名登录 → 发现隐藏文件夹 → 发现ssh密钥 → 猜解ssh用户名 → ssh密钥登录 提 权 思 路 : 发现suid权限文件 → cpulimit提权 准备工作 启动VPN 获取攻击机IP → 192.168.45.191 启动靶机 获取目标机器IP → 192.168.179.130 信息收集-端口扫…

Android自定义瀑布流文字展示

在历史搜索功能中&#xff0c;我们常用到一个瀑布流展示控件&#xff0c;用来展示我们的搜索记录&#xff0c;所以就自定义一个吧&#xff01; 布局中代码示例 <com.example.mymodularization.measure.LinearCustomandroid:id"id/ll"android:layout_width"wr…

基于深度学习的点云三维目标检测方法综述

论文标题&#xff1a;基于深度学习的点云三维目标检测方法综述 作者&#xff1a;郭毅锋&#xff11;&#xff0c;&#xff12;†&#xff0c;吴帝浩&#xff11;&#xff0c;魏青民&#xff11; 发表日期&#xff1a; 2023 1 阅读日期 &#xff1a;2023 11 29 研究背景&…

一、Gradle 手动创建一个项目

文章目录 Gradle 介绍Gradle Wrapper Gradle 使用手动安装 Gradle初始化 Gradle 介绍 Gradle 是一个快速的、可信的、适应性强的自动化构建工具&#xff0c;它是开源的。它使用优雅的并且可扩展的描述性语言。其他的介绍在官网可以了解。 Gradle Wrapper 官方建议使用 Gradl…

vue3实现元素拖拽移动功能

效果图 实现拖拽移动 首先我们给需要实现功能的元素加一个draggable"true"让元素能够被拖拽 先来认识两个搭配draggable属性一起使用的事件——ondragstart和ondragend&#xff0c;它们的定义分别为&#xff1a; ①. ondragstart 事件在用户开始拖动元素或选择的文…

Python中使用matplotlib库绘图中如何给图形的图例设置中文字体显示

问题&#xff1a;当使用matplotlib绘图时遇到绘图&#xff0c;图例显示不出来中文字体 解决方式&#xff1a; 1&#xff09;加载字体管理库 from matplotlib.font_manager import FontProperties 2&#xff09;设置系统上字体的路径 font FontProperties(fname"C:\\W…

docker搭建node环境开发服务器

docker搭建node环境开发服务器 本文章是我自己搭建node环境开发服务器的过程记录&#xff0c;不一定完全适用所有人。根据个人情况&#xff0c;按需取用。 命名项目路径 为了方便cd到项目路径&#xff0c;将项目路径重命名&#xff0c;方便输入。 vim /etc/profile # 修改p…

Linux 下命令行启动与关闭WebLogic的相关服务

WebLogic 的服务器类型 WebLogic提供了三种类型的服务器&#xff1a; 管理服务器节点服务器托管服务器 示例和关系如下图&#xff1a; 对应三类服务器&#xff0c; 就有三种启动和关闭的方式。本篇介绍使用命令行脚本的方式启动和关闭这三种类型的服务器。 关于WebLogic 的…

如何通过“闻香”给葡萄酒分类?

有句话叫做“闻香识女人”&#xff0c;葡萄酒也如同美女&#xff0c;千娇百媚风情万种&#xff0c;所以通过“闻香”也可以给葡萄酒进行分类。 那么&#xff0c;云仓酒庄的品牌雷盛红酒分享葡萄酒都有哪些不同的香呢&#xff1f; 云仓酒庄是云仓酒庄的结合&#xff0c;也就是在…

深入了解Java8新特性-日期时间API之ZonedDateTime类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概19000多字&#xff0c;预计阅读时间长需要10分钟以上。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

群晖安装portainer

一、下载镜像 打开【Container Manager】 ,搜索portainer&#xff0c;双击【6053537/portainer-ce】下载汉化版本 二、创建映射文件夹 打开【File Station】&#xff0c;在docker目录下创建【portainer】文件夹 三、开启SSH 群晖 - 【控制面板】-【终端机和SNMP】 勾选【启动…

oracle数据库节点一宕机重启后集群crsd服务没有起

13:18:55时节点一服务器宕机后&#xff0c;节点2心跳不通剔除了节点1 之后节点1服务器重启 集群设置自动拉起&#xff0c;但节点一启动后集群在crsd服务上迟迟没有起来 去查看了crsd的日志发现这一时间点心跳一直不通 在节点一起crsd服务&#xff0c;执行以下命令 #&#x…

Cytoscape学习教程

写在前面 今天分享的内容是自己遇到问题后,咨询社群里面的同学,帮忙解决的总结。 关于Cytoscape,对于做组学或生物信息学的同学基本是陌生的,可能有的同学用这个软件作图是非常溜的,做出来的网络图也是十分的好看,“可玩性”很高,就像前面分享的aPEAR包一样aPEAR包绘制…

0基础能不能转行做网络安全?网络安全人才发展路线

最近有同学在后台留言&#xff0c;0基础怎么学网络安全&#xff1f;0基础可以转行做网络安全吗&#xff1f;以前也碰到过类似的问题&#xff0c;想了想&#xff0c;今天简单写一下。 我的回答是先了解&#xff0c;再入行。 具体怎么做呢&#xff1f; 首先&#xff0c;你要确…

羊大师不说,你会知道酸奶也能加热吗?

羊大师不说&#xff0c;你会知道酸奶也能加热吗&#xff1f; 酸奶是一种非常受欢迎的健康食品&#xff0c;不仅可以冷饮&#xff0c;还可以热着喝哦&#xff01;你可能会好奇&#xff0c;酸奶热着喝会不会破坏其营养价值呢&#xff1f;别着急&#xff0c;让小编羊大师来为你解…

基于springboot的电影院管理系统的设计与实现 (含论文和源码视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的电影院管理系统7拥有两种角色 管理员&#xff1a;用户管理、购票统计、电影管理、电影类型管理、放映厅管理、订单管理等 用户&#xff1a;登录注册、查看各种信息、购票…

Spark local模式的安装部署

安装与配置Spark开发环境。 相关知识 Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架&#xff0c;Spark拥有Hadoop MapReduce所具有的优点&#xff1b;但…