华为鸿蒙应用--封装通用标题栏:CommonTitleBar(鸿蒙工具)-ArkTs

0、效果图

自定义通用标题栏

支持左、中、右常规标题栏设置;

支持自定义视图;

支持搜索功能

一、CommTitleBar代码
import router from '@ohos.router';
import { Constants } from '../../constants/Constants';
import { StyleConstants } from '../../constants/StyleConstants'
import { toast } from '../../utils/ToastUtils';

@Component
export struct CommonTitleBar {
  @State titleBarHeight: number = 50; // 标题栏高度
  @State showBottomLine: boolean = true; //  是否显示标题栏底部的分割线
  titleBarColor: ResourceColor = '#f5f5f5'; // 标题栏颜色
  bottomLineColor: ResourceColor = "#DDDDDD"; // 标题栏分割线颜色

  @State leftType: number = Constants.TYPE_LEFT_IMAGE_VIEW; // 左侧视图类型:无|文字|按钮|自定义视图,默认显示返回按钮
  @State leftText: string = '左侧文字'; // 左侧文字leftType= textView有效
  @State leftMargin: number | string = 12; // 左侧间距
  leftTextColor: ResourceColor = "#000000"; // 左侧文字颜色
  @State leftTextSize: number | string = 16; // 左侧文字大小
  leftImageResource: string | PixelMap | Resource = $r('app.media.img_back_black'); // 左侧返回图片
  @BuilderParam leftCustomView: () => void = null; // 左侧自定义View
  onClickLeftText?: () => void; // 左侧文字点击事件
  onClickLeftImage?: () => void; // 左侧图片点击事件

  @State rightType: number = Constants.TYPE_RIGHT_NONE; // 右侧视图类型:无|文字|按钮|自定义视图,默认无视图
  @State rightText: string = '右侧文字'; // 右侧文字leftType= textView有效
  @State rightMargin: number | string = 12; // 右侧间距
  rightTextColor: ResourceColor = "#000000"; // 右侧文字颜色
  @State rightTextSize: number | string = 16; // 右侧文字大小
  rightImageResource: string | PixelMap | Resource = $r('app.media.img_back_black'); // 右侧图片
  @BuilderParam rightCustomView: () => void = null; // 右侧自定义View
  onClickRightText?: () => void; // 右侧文字点击事件
  onClickRightImage?: () => void; // 右侧图片点击事件

  @State centerType: number = Constants.TYPE_CENTER_TEXT_VIEW; // 居中视图类型:无|文字|按钮|自定义视图,默认文字视图
  @State centerText: string = '居中文字'; // 居中文字leftType= textView有效
  centerTextColor: ResourceColor = "#000000"; // 居中文字颜色
  @State centerTextSize: number | string = 16; // 居中文字大小
  centerImageResource: string | PixelMap | Resource = $r('app.media.img_back_black'); // 居中图片
  @State searchLeftMargin: number | string = 12; // 右侧间距
  @State searchRightMargin: number | string = 12; // 右侧间距
  @BuilderParam centerCustomView: () => void = null; // 居中自定义View
  onClickCenterText?: () => void; //  居中文字点击事件
  onClickCenterImage?: () => void; // 居中图片点击事件
  @State value: string = ''; // 居中搜索框默认文本
  @State placeholder: string = '请输入关键字'; // 居中搜索框提示文本
  @State searchButton: string = ''; // 居中搜索框提示文本
  onSubmitSearch?: (value: string) => void; // 点击搜索图标、搜索按钮或者按下软键盘搜索按钮时触发该回调
  onChangeSearch?: (value: string) => void; // 输入内容发生变化时,触发该回调

  build() {
    RelativeContainer() {
      if (this.leftType === Constants.TYPE_LEFT_TEXT_VIEW) {
        Text(this.leftText)
          .alignRules({
            left: { anchor: "__container__", align: HorizontalAlign.Start },
            center: { anchor: "__container__", align: VerticalAlign.Center }
          })
          .margin({
            left: this.leftMargin
          })
          .fontColor(this.leftTextColor)
          .fontSize(this.leftTextSize)
          .maxLines(1)
          .onClick(() => {
            if (this.onClickLeftText !== undefined) {
              this.onClickLeftText();
            }
          })
          .id('left')
      }
      else if (this.leftType === Constants.TYPE_LEFT_IMAGE_VIEW) {
        Image(this.leftImageResource)
          .height(18)
          .alignRules({
            left: { anchor: "__container__", align: HorizontalAlign.Start },
            center: { anchor: "__container__", align: VerticalAlign.Center }
          })
          .margin({
            left: this.leftMargin
          })
          .onClick(() => {
            if (this.onClickLeftImage !== undefined) {
              this.onClickLeftImage();
            } else {
              router.back()
            }
          })
          .id('left')
      }
      else if (this.leftType === Constants.TYPE_LEFT_CUSTOM_VIEW) {
        Column() {
          this.leftCustomView()
        }.alignRules({
          left: { anchor: "__container__", align: HorizontalAlign.Start },
          center: { anchor: "__container__", align: VerticalAlign.Center }
        })
        .margin({
          left: this.leftMargin
        })
        .id('left')
      }

      if (this.rightType === Constants.TYPE_RIGHT_TEXT_VIEW) {
        Text(this.rightText)
          .alignRules({
            right: { anchor: "__container__", align: HorizontalAlign.End },
            center: { anchor: "__container__", align: VerticalAlign.Center }
          })
          .margin({
            right: this.rightMargin
          })
          .fontColor(this.rightTextColor)
          .fontSize(this.rightTextSize)
          .maxLines(1)
          .onClick(() => {
            if (this.onClickRightText !== undefined) {
              this.onClickRightText();
            }
          })
          .id('right')
      }
      else if (this.rightType === Constants.TYPE_RIGHT_IMAGE_VIEW) {
        Image(this.rightImageResource)
          .height(18)
          .alignRules({
            right: { anchor: "__container__", align: HorizontalAlign.End },
            center: { anchor: "__container__", align: VerticalAlign.Center }
          })
          .margin({
            right: this.rightMargin
          })
          .onClick(() => {
            if (this.onClickRightImage !== undefined) {
              this.onClickRightImage();
            } else {
              toast("点击了")
            }
          })
          .id('right')
      }
      else if (this.rightType === Constants.TYPE_RIGHT_CUSTOM_VIEW) {
        Column() {
          this.rightCustomView()
        }.alignRules({
          right: { anchor: "__container__", align: HorizontalAlign.End },
          center: { anchor: "__container__", align: VerticalAlign.Center }
        })
        .margin({
          right: this.rightMargin
        })
        .id('right')
      }

      if (this.centerType === Constants.TYPE_CENTER_TEXT_VIEW) {
        Text(this.centerText)
          .alignRules({
            middle: { anchor: "__container__", align: HorizontalAlign.Center },
            center: { anchor: "__container__", align: VerticalAlign.Center }
          })
          .fontColor(this.centerTextColor)
          .fontSize(this.centerTextSize)
          .maxLines(1)
          .onClick(() => {
            if (this.onClickCenterText !== undefined) {
              this.onClickCenterText();
            }
          })
          .id('center_text')
      }
      else if (this.centerType === Constants.TYPE_CENTER_IMAGE_VIEW) {
        Image(this.centerImageResource)
          .height(18)
          .alignRules({
            middle: { anchor: "__container__", align: HorizontalAlign.Center },
            center: { anchor: "__container__", align: VerticalAlign.Center }
          })
          .onClick(() => {
            if (this.onClickRightImage !== undefined) {
              this.onClickRightImage();
            } else {
              toast("点击了")
            }
          })
          .id('center_image')
      }
      else if (this.centerType === Constants.TYPE_CENTER_CUSTOM_VIEW) {
        Column() {
          this.centerCustomView()
        }.alignRules({
          middle: { anchor: "__container__", align: HorizontalAlign.Center },
          center: { anchor: "__container__", align: VerticalAlign.Center }
        })
        .id('center_custom')
      }
      else if (this.centerType === Constants.TYPE_CENTER_SEARCH_VIEW) {
        Column() {
          Search({
            value: this.value,
            placeholder: this.placeholder,
          })
            .height(38)
            .searchButton(this.searchButton)
            .onSubmit((value: string) => {
              this.onSubmitSearch(value);
            })
            .onChange((value: string) => {
              this.onChangeSearch(value);
            })
        }
        .alignRules({
          left: { anchor: "left", align: HorizontalAlign.End },
          right: { anchor: "right", align: HorizontalAlign.Start },
          center: { anchor: "__container__", align: VerticalAlign.Center },
        })
        .margin({
          left: this.searchLeftMargin,
          right: this.searchRightMargin
        })
        .id('center_search')
      }
    }
    .width(StyleConstants.FULL_WIDTH)
    .height(this.titleBarHeight)
    .backgroundColor(this.titleBarColor)
    .border({
      width: { bottom: this.showBottomLine ? '1vp' : '0' },
    })
    .borderColor(this.bottomLineColor)
  }
}

Constants:
  // 自定义标题栏
  static readonly TYPE_LEFT_NONE: number = 0;
  static readonly TYPE_LEFT_TEXT_VIEW: number = 1;
  static readonly TYPE_LEFT_IMAGE_VIEW: number = 2;
  static readonly TYPE_LEFT_CUSTOM_VIEW: number = 3;

  static readonly TYPE_RIGHT_NONE: number = 0;
  static readonly TYPE_RIGHT_TEXT_VIEW: number = 1;
  static readonly TYPE_RIGHT_IMAGE_VIEW: number = 2;
  static readonly TYPE_RIGHT_CUSTOM_VIEW: number = 3;

  static readonly TYPE_CENTER_NONE: number = 0;
  static readonly TYPE_CENTER_TEXT_VIEW: number = 1;
  static readonly TYPE_CENTER_IMAGE_VIEW: number = 2;
  static readonly TYPE_CENTER_CUSTOM_VIEW: number = 3;
  static readonly TYPE_CENTER_SEARCH_VIEW: number = 4;
二、调用方法
import { CommonTitleBar, Constants, StyleConstants, toast } from '@ohos/common'

@Component
export struct Contact {
  @Builder leftBuilder() {
    Row() {
      Text('自定义')
        .onClick(() => {
          toast('点击自定义')
        })
      Image($r('app.media.img_select'))
        .height(20)
    }
  }

  @Builder rightBuilder() {
    Row() {
      Text('自定义')
        .onClick(() => {
          toast('点击自定义')
        })
      Image($r('app.media.img_select'))
        .height(20)
    }
  }

  @Builder centerBuilder() {
    Row() {
      Text('自定义')
        .onClick(() => {
          toast('点击自定义')
        })
      Image($r('app.media.img_select'))
        .height(20)
    }
  }

  build() {
    Column() {
      CommonTitleBar({
        leftType: Constants.TYPE_LEFT_CUSTOM_VIEW,
        leftCustomView: this.leftBuilder,
        leftText: "企业通讯录",
        rightType: Constants.TYPE_RIGHT_CUSTOM_VIEW,
        rightCustomView: this.rightBuilder,
        rightText: '确定',
        centerType: Constants.TYPE_CENTER_SEARCH_VIEW,
        centerText: "居中",
        centerCustomView: this.centerBuilder,
        onClickLeftText: (): void => {
          toast('AAA')
        },
        onClickLeftImage: (): void => {
          toast('onClickLeftImage')
        },
        onSubmitSearch: (value): void => {
          toast(value);
        },
        onChangeSearch: (value): void => {
          toast(value);
        }
      })
    }
    .width(StyleConstants.FULL_WIDTH)
    .height(StyleConstants.FULL_WIDTH)
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL 把多余字段转JSON

核心SQL: json_agg(json_build_object(kgrq, a.kgrq, jgrq, a.jgrq, sgdd, a.sgdd))

理解与使用Linux设备树编译器(DTC)

这里写目录标题 设备树简介设备树编译器(DTC)安装DTC使用DTC实例:编辑设备树小结参考资料 Linux设备树编译器(DTC)是一个关键工具,用于处理嵌入式Linux系统中的设备树文件。本文将介绍设备树的概念、DTC的基…

基于Docker + Locust的数据持久化性能测试系统

前几天给大家分享了如何使用Locust进行性能测试,但是在实际使用中会发现存在压测的结果无法保存的问题,比如在分布式部署情况下进行压测,每轮压测完成需要释放资源删除容器重新部署后,这段时间的压测结果就都丢失了,如…

一文讲解Android车载系统camera架构 - EVS

Android的camera开发中,使用最多的是camera2 以及现在Google主推的cameraX 架构,而这两个架构主要针对的是手机移动端上camera的流程。 而今天介绍的EVS(Exterior View System)架构是不同于camera2上的手机架构,针对Automotive的版本&#x…

【源码阅读】 Golang中的database/sql库源码探究

Note:文章待完结 文章目录 前言一、整体目录结构二、driver包1、驱动相关driver.Driver2、驱动连接:driver.Conn3、预处理结构:Stmt4、执行结果 driver.Result5、查询结果:driver.Rows6、driver.RowsAffected7、driver.Value8、Va…

vue-quill-editor富文本插件控制字数显示

最终效果 富文本编辑框&#xff0c;只统计内容&#xff0c;不包含标签以及样式&#xff0c;超出最大字数限制提示。 具体代码 html <div class"relative"><quillEditorv-model"form.nutriSuggestion"ref"myQuillEditor7":options&quo…

03-JAVA设计模式-策略模式

策略模式 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是行为设计模式之一&#xff0c;它使你能在运行时改变对象的行为。在策略模式中&#xff0c;一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中&#xff0c;…

uniapp微信小程序开发踩坑日记:由于图表数据渲染不出来,我第一次在项目中用watch函数监听数据变化

一、发现问题 在我们团队自己开发的微信小程序中&#xff0c;引入了Echarts图表库 然后突然有一天&#xff0c;后端队友反应图表渲染有问题。后面我去试了一下&#xff0c;确实20次里面必有一次数据渲染不出来 断定代码没问题&#xff0c;于是我们将其鉴定为玄学 二、问题原因…

【GitHub】主页简历优化

【github主页】优化简历 写在最前面一、新建秘密仓库二、插件卡片配置1、仓库状态统计2、Most used languages&#xff08;GitHub 常用语言统计&#xff09;使用细则 3、Visitor Badge&#xff08;GitHub 访客徽章&#xff09;4、社交统计5、打字特效6、省略展示小猫 &#x1f…

UDP和TCP(传输层)

这里写目录标题 UDPUDP的基本特点UDP协议报文格式 TCPTCP协议报文格式TCP特点可靠传输实现机制确认应答超时重传数据丢了应答报文丢了 小结 UDP UDP的基本特点 无连接不可靠传输面向数据报全双工 UDP协议报文格式 2个字节有效范围(无符号): 0 ~ 65535(2^16 - 1). 2个字节有效范…

用数据检验函数正确性,matlab2C

数据存取格式 filename1 g.txt; fid1 fopen(filename1,w); for i 1 : length(g)for j1:size(g,2)if(j1)fprintf(fid1,{%.16f,,g(i,j)); elseif(j>1&&j<151)fprintf(fid1,%.16f,,g(i,j)); elsefprintf(fid1,%.16f},\n,g(i,j));endend%fprintf(fid1,\n…

如何用Python语言实现远程控制4路控制器/断路器

如何用Python语言实现远程控制4路控制器/断路器呢&#xff1f; 本文描述了使用Python语言调用HTTP接口&#xff0c;实现控制4路控制器/断路器&#xff0c;支持4路输出&#xff0c;均可独立控制&#xff0c;可接入各种电器。 可选用产品&#xff1a;可根据实际场景需求&#xf…

Spring Web MVC入门(3)——响应

目录 一、返回静态页面 RestController 和 Controller之间的关联和区别 二、返回数据ResponseBody ResponseBody作用在类和方法的情况 三、返回HTML代码片段 响应中的Content-Type常见的取值&#xff1a; 四、返回JSON 五、设置状态码 六、设置Header 1、设置Content…

2024李卜常识开天斧

2024年&#xff0c;李卜常识开天斧课程以其独特的魅力吸引了众多学子。这门课程如同开天辟地的神斧&#xff0c;帮助我们打开常识知识的大门&#xff0c;引领我们走进一个全新的学习世界。在李卜老师的悉心指导下&#xff0c;我们逐渐掌握了各种常识知识&#xff0c;拓宽了视野…

leaftjs+turfjs+idw纯前端实现等值面绘图+九段线

最近有个绘制等值面图的需求。我们一般的实现路径是&#xff1a; 1.后台绘图&#xff0c;用surfer绘制好&#xff0c;给前端调用叠加到地图。 2.后台用python绘图&#xff0c;绘制好给前端调用&#xff0c;叠加到地图。 3.后台进行插值计算、地图裁剪、最终生成geojson文件或…

VS2019配合QT5.9开发IRayAT430相机SDK

环境配置 VS2019 QT5.9 编译器版本 MSVC2017_64添加系统环境变量&#xff08;完毕后重启电脑&#xff09; 从VS2019中下载Qt插件 从VS2019中添加单个编译组件 上述操作完成后用VS打开工程文件&#xff0c;工程文件地址 &#xff1a; C:\Users\86173\Desktop\IRCNETSDK_W…

初识 Linux

一、基础命令 0、 ls cd cat pwd 当前工作目录 find -name 测试.py 查找文件 grep "学院" 测试.py 查找字符串 "学院" 在文件 测试.py 中位置&#xff0c;输出所在的 行 1、重定向器 echo "Hello Kali Linux!" > Hello 创建 文件 Hel…

openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__

文章目录 openssl3.2 - exp - 使用默认的函数宏&#xff0c;在release版中也会引入__FILE__概述笔记验证是否__FILE__在release版下也能用&#xff1f;将openssl编译成release版的&#xff0c;看看CRYPTO_free()是否只需要一个参数就行&#xff1f;将工程中的openssl相关的库换…

stream中的foreach,allMatch,noneMatch,anyMatch的基本使用

1.1foreach遍历集合元素 1.2anyMatch()的使用 结论:上边使用foreach循环遍历和使用anyMatch()的作用相同 2.allMatch() 2.1初级使用 2.2进级使用 3.noneMatch()使用

Python 实现视频去抖动技术

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 视频去抖动是视频处理中的一项重要技术&#xff0c;它可以有效地减少视频中由于相机震动或手…