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

news2025/1/16 19:54:13
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)
  }
}

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

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

相关文章

JavaEE 初阶篇-深入了解 UDP 通信与 TCP 通信(综合案例:实现 TCP 通信群聊)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 UDP 通信 1.1 DatagramSocket 类 1.2 DatagramPacket 类 1.3 实现 UDP 通信(一发一收) 1.3.1 客户端的开发 1.3.2 服务端的开发 1.4 实现 …

FTP与SMB深度对比:文件传输协议谁更胜一筹?

在数字化时代,文件传输已成为日常工作中不可或缺的一部分。 FTP(文件传输协议)和SMB(服务器消息块)是两种最为常见的文件传输协议。它们各自在文件传输领域拥有独特的优势和特点,但同时也存在一些差异。 今…

六个月滴滴实习:轻松、舒心又高薪!

不久前,一位在滴滴后端研发部门实习了六个月的小伙伴在牛客网上分享了他的实习体验, 作者详细描述了他在滴滴的实习生活。 从他的叙述中,我们可以感受到与其他互联网公司相比,滴滴的工作环境显得相对轻松和舒适。 他提到&#x…

【汇编语言】流程转移和子程序

【汇编语言】流程转移和子程序 文章目录 【汇编语言】流程转移和子程序前言一、“转移”综述二、操作符offset三、jmp指令jmp指令——无条件转移jmp指令:依据位移进行转移两种段内转移远转移:jmp far ptr 标号转移地址在寄存器中的jmp指令转移地址在内存…

神经网络进阶

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

socket套接字在tcp客户端与tcp服务器之间的通信,以及socket中常用的高效工具epoll

1.socket(套接字)的概念 Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议,主要利用三元组【ip地址,协议&am…

10G网络布线:DAC线缆与AOC光缆的选择指南

在10G网络部署中,选择合适的传输介质是确保网络性能和可靠性的关键。本文将全面比较10G DAC高速线缆和10G AOC有源光缆,帮助您做出明智的选择。 10G DAC高速线缆 VS 10G AOC有源光缆 定义与构造 10G DAC高速线缆(Direct Attach Cable&…

配置有效的防爬虫技术保护网站

本文主要介绍了防爬虫的概念、目的以及一些有效的防爬虫手段。防爬虫是指网站采取各种技术手段阻止爬虫程序对其数据进行抓取的过程。为了保护网站的数据和内容的安全性,防止经济损失和恶意竞争,以及减轻服务器负载,网站需要采取防爬虫机制。…

文心一言4.0、智谱清言、MoonshotAI实测对比(上)

前言 前两天看到这张图,又刚好拿到了文心一言的4.0内测号,就想着把新版国内御三家横向对比测评一下。 文末领取免费领取AI学习基地 AI交流群 前一段时间也一直在研究复杂提示词(结构化提示词)向国内大模型迁移适配的问题&#…

matlab新手快速上手5(蚁群算法)

本文根据一个较为简单的蚁群算法框架详细分析蚁群算法的实现过程,对matlab新手友好,源码在文末给出。 蚁群算法简介: 蚁群算法是一种启发式优化算法,灵感来源于观察蚂蚁寻找食物的行为。在这个算法中,解决方案被看作是…

Fhopify:跨境电商行业迎来发展新机遇打造购物者天堂

随着全球化的推进和互联网的普及,跨境电商作为一种新型的商业模式,日益受到人们的关注和重视。它通过互联网平台,打破了地域限制,使得消费者可以便捷地购买来自世界各地的商品,同时也为企业提供了更广阔的市场和发展空间。在这样的背景下,跨境电商的新趋势和未来发展备受关注。…

ShardingSphere 5.x 系列【24】集成 Nacos 配置中心

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. ShardingSphereDriverURLProvider3. 方式一:基于 Nacos Java SDK…

初学python记录:力扣2739. 总行驶距离

题目: 卡车有两个油箱。给你两个整数,mainTank 表示主油箱中的燃料(以升为单位),additionalTank 表示副油箱中的燃料(以升为单位)。 该卡车每耗费 1 升燃料都可以行驶 10 km。每当主油箱使用了…

演示在一台Windows主机上运行两个Mysql服务器(端口号3306 和 3307),安装步骤详解

目录 在一台Windows主机上运行两个Mysql服务器,安装步骤详解因为演示需要两个 MySQL 服务器终端,我只有一个 3306 端口号的 MySQL 服务器,所以需要再创建一个 3307 的。创建一个3307端口号的MySQL服务器1、复制 mysql 的安装目录2、修改my.in…

基于springboot实现海滨学院班级回忆录的设计项目【项目源码+论文说明】计算机毕业设计

基于springboot实现海滨学院班级回忆录的设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足,创建了一个计算机管理海…

Andorid进程间通信之 UNIX SOCKET

1,什么是UNIX SOCKET UNIX SOCKET,域套接字,UNIX SOCKET可用于同一台设备进程间通信,它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序列号应答等,只需要将数据从一个进程复制到另一个进程&…

xray使用入门

简介 长亭科技旗下的一款网络安全漏洞扫描工具,用于检测和评估web应用程序的安全性。具有一下特点:检测速读快、检查范围广、代码质量高、高级可定制以及安全无危害。属于不开源的项目,用户直接下载xray的可执行文件,即可运行该工…

SSH远程连接docker容器-Linux-SSH -L 打隧道

问题:在物理机上用podman创建了一个容器,想SSH直接远程连接docker容器 解决方式: 步骤1: 在本地terminal输入以下命令: ssh -L 容器端口号:localhost:容器端口号 物理机用户名物理机ip -p 物理机端口号 即可,可新打…

1、k8s问题pod从service中剔除

一、起因 redis原来由两服务器的集群变为三服务器的集群,通过statefulset扩展了两节点,并把redis-app-0和redis-app-3从集群中去除,但是由于service路由后端不变,导致程序连接后端仍然可能到redis-app-0和redis-app-3 二、处理 …

WiFi、Ethenet、4G优先级切换

1、多网卡情况下如何调整优先级方案 按照目前公司前辈给出的方案&#xff0c;调整优先级的手段有两种&#xff1a; <1>.删除默认路由--route del 的方法 <2>.ifmetric源码提供的修改路由表的mteric的值来设置路由的优先级&#xff0c;metric越小优先级越高。 应…