【HarmonyOS】鸿蒙自定义TabLayout示例

news2024/9/27 8:35:00

【HarmonyOS】自定义TabLayout代码示例,通过 Scroll 锚点 Tab 布局,滚动条会自动滚动使选中的标签居中显示。

class MyTabItem {
  label: string = "";
  positionX: number = -1; // 当前位置
  width: number = -1; // 当前宽度

  constructor(label: string) {
    this.label = label;
  }
}

@Component
struct MyTabLayout {
  onSelected?: (selectedIndex: number) => void;
  scroller: Scroller = new Scroller();
  @Prop tabItems: MyTabItem[];
  @State @Watch('selectIndexChanged') selectedIndex: number = 0;
  @State tabBarWidth: number = 0; // Tab 栏宽度

  selectIndexChanged() {
    if (this.onSelected) {
      this.onSelected(this.selectedIndex);
    }
  }

  build() {
    Column() {
      Scroll(this.scroller) {
        Row() {
          ForEach(this.tabItems, (item: MyTabItem, index: number) => {
            Row() {
              Image($r('app.media.app_icon')).width('44lpx').height('44lpx');
              Text(item.label)
                .margin({ left: '16lpx' })
                .fontColor(index === this.selectedIndex ? "#FF1919" : "#2E2E2E")
                .fontSize('30lpx');
            }.padding({ right: '16lpx' })
            .onAreaChange((previousArea: Area, currentArea: Area) => {
              if (item.positionX === -1) {
                item.positionX = currentArea.position.x as number;
              }
              if (item.width === -1) {
                item.width = currentArea.width as number;
              }
            })
            .onClick(() => {
              this.selectedIndex = index;

              this.scroller.scrollTo({
                xOffset: (item.positionX - this.tabBarWidth / 2 + item.width / 2),
                yOffset: 0,
                animation: true
              });
            });
          });
        }.height('95lpx');
      }
      .scrollable(ScrollDirection.Horizontal)
      .scrollBar(BarState.Off)
      .borderWidth({ bottom: 1 })
      .borderColor("#e3e3e3")
      .align(Alignment.Start)
      .width('100%')
      .onAreaChange((previousArea: Area, currentArea: Area) => {
        this.tabBarWidth = currentArea.width as number;
      });
    }
  }
}

@Entry
@Component
struct Page11 {
  scroller: Scroller = new Scroller();
  @State tabItems: MyTabItem[] = [];
  @State selectedIndex: number = 0

  getRandomInt(min: number, max: number): number {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

  aboutToAppear(): void {
    for (let i = 0; i < 20; i++) {
      this.tabItems.push(new MyTabItem(`项目:${this.getRandomInt(1, 10000)}`));
    }
  }

  build() {
    Column() {
      MyTabLayout({
        tabItems: this.tabItems,
        onSelected: (selectedIndex: number) => {
          console.info(`当前选择的位置: ${selectedIndex}`);
          this.selectedIndex = selectedIndex
        }
      });
      Stack() {
        Text(`当前选择的位置:${this.selectedIndex}`)
      }.width('100%')
      .layoutWeight(1)
      .backgroundColor(Color.Orange)
    }
    .height('100%')
    .width('100%');
  }
}

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

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

相关文章

OpenHarmony(鸿蒙南向)——平台驱动指南【HDMI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 HDMI&#xff08;High Definition Multimedia Int…

VS Code设置合集

目录 VS Code设置合集1、汉化2、VS Code自动报错3、VS Code右键没有Open In Default Browser4、VS Code设置颜色主题5、修改默认缩进字符 VS Code设置合集 1、汉化 点击插件 → 搜索chinese → 点击install&#xff0c; 同时按住ctrl shift P → 搜索>configure displ…

架构师:消息队列的技术指南

1、简述 消息队列(Message Queue, MQ)是一种异步通信机制,允许系统的各个组件通过消息在彼此之间进行通信。消息队列通过解耦系统组件、缓冲高峰期请求和提高系统的可扩展性,成为分布式系统中不可或缺的一部分。 2、工作原理 消息队列的基本工作原理是生产者将消息发布到…

Lesson08---string(4)类

Lesson08—string类&#xff08;4&#xff09; c第八章string类的实现 文章目录 Lesson08---string类&#xff08;4&#xff09;前言一、计算机是怎么储存文字的1. 在此之前先思考一个问题2.编码表2.1 ascll码2.2unicode码2.3UTF码2.4gbk码 二、实现一个简单的string1.构造函数…

【LeetCode】每日一题 2024_9_21 边积分最高的节点(哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;边积分最高的节点 代码与解题思路 func edgeScore(edges []int) (ans int) {// 直接维护哈希最大值即可mp : map[int]int{}for i, v : range edges {mp[v] i// 如果多个节点的 边积分 相…

Flutter中使用FFI的方式链接C/C++的so库(harmonyos)

Flutter中使用FFI的方式链接C/C库&#xff08;harmonyos&#xff09; FFI plugin创建和so的配置FFI插件对so库的使用 FFI plugin创建和so的配置 首先我们可以根据下面的链接生成FFI plugin插件&#xff1a;开发FFI plugin插件 然后在主项目中pubspec.yaml 添加插件的依赖路径&…

PDF 秒变 JPG,2024 这些工具来助力

有些扫描仪默认将扫描文档保存为PDF格式&#xff0c;若事先未加留意&#xff0c;便可能累积大量PDF文件。然而&#xff0c;在需要将这些文件插入到其他文档或进行图形设计时&#xff0c;PDF格式可能会显得不够灵活或便捷。这时&#xff0c;将PDF转换为JPG图片格式就成为了一个实…

9.C++程序中的选择语句

选择语句一共分为两种&#xff1a;条件语句和开关语句 其中条件语句叫if语句&#xff0c;常见的形式为&#xff1a;if ... else ... ; 再复杂一些为if... else if ... else ... ; 开关语句又叫switch语句&#xff0c;类型于开关的使用形式常见的有 switch (var) case : ... b…

ai写论文哪个软件好?分享4款ai论文写作工具软件

在当前的学术研究和论文写作领域&#xff0c;AI技术的应用已经成为一种趋势。AI论文写作工具不仅能够提高写作效率&#xff0c;还能帮助研究者生成高质量的论文。以下是四款值得推荐的AI论文写作工具软件&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 传送…

Cluade 3.5 Sonnet 提示词泄露

prompt 翻译&#xff1a; The notebook currently demonstrates support for a two agent setup. Support for GroupChat is currently in development.

EF Core优化技巧之预热处理

1. 前言 今天和听到同事们在讨论一个关于使用EFCore时&#xff0c;为什么第一次查询数据库总是很慢的原因。我们在工作中经常使用EFCore进行数据访问&#xff0c;但发现每次第一次查询都需要较长的时间&#xff0c;这给我们带来了困扰。因此&#xff0c;我们聚在一起&#xff…

Redis实战--Redis应用过程中出现的热门问题及其解决方案

Redis作为一种高性能的key-value数据库&#xff0c;广泛应用于缓存、消息队列、排行榜等场景。然而&#xff0c;在实际应用中&#xff0c;随着业务规模的不断扩大和访问量的持续增长&#xff0c;缓存系统也面临着诸多挑战&#xff0c;其中最为典型的便是缓存穿透、缓存击穿和缓…

Ansible集群服务部署案例

案例描述 本案例共讲述了多个节点部署Elk集群日志分析系统&#xff0c;分别在三个节点使用ansible部署Kibana、Logstash以及Elasticsearch服务。 案例准备 1. 规划节点 IP 主机名 节点 192.168.100.25 ansible Ansible节点 192.168.100.35 node1 Elasticsearch/Kiba…

shell用文件管理备份文件路径

从文件中读取文件路径 while IFS read -r s; do&#xff1a;这行代码启动一个 while 循环&#xff0c;逐行读取 001.sh 文件的内容。 IFS&#xff1a;将内部字段分隔符&#xff08;IFS&#xff09;设置为空&#xff0c;确保读取整行而不被默认的空格和换行符分隔。这样可以保…

知识管理数据库

知识管理数据库&#xff0c;可以分为几类&#xff1a; 灵感库、卡片库、作品库。 灵感库&#xff0c;通常是素材&#xff0c;想法。 片库&#xff0c;是完整的&#xff0c;成段落的文字。 作品库&#xff0c;是文章、专栏&#xff0c;或者书籍。 这三者的关系&#xff0c;好比…

java通过webhook给飞书发送群消息

现在使用飞书的人越来越多了&#xff0c;飞书有一个最大的好处&#xff0c;可以使用webhook简便的发送群消息。而在工作中&#xff0c;也经常会因为一些运维方面的工作&#xff0c;需要给飞书发送群消息&#xff0c;来实时提醒相关负责人,及时处理工作。 一、先看一下效果吧&a…

【计算机网络】网络层详解

文章目录 一、引言二、IP 基础知识1、IP 地址2、路由3、IP报文4、IP报文的分片与重组 三、IP 属于面向无连接型四、IP协议相关技术1、DNS2、ICMP3、NAT技术4、DHCP 一、引言 TCP/IP的心脏是网络层。这一层主要由 IP 和 ICMP 两个协议组成。网络层的主要作用是“实现终端节点之…

Visual Studio Code下载安装及汉化

官网&#xff1a;https://code.visualstudio.com/ 按照指示一步步操作即可&#xff1a; 汉化&#xff1a;

Stable Diffusion零基础学习

Stable Diffusion学习笔记TOP12 _插件篇之ControlNet功能篇 ControlNet目前支持的10多种预处理器&#xff0c;根据数据检测种类可分为两种类型&#xff1a; 1、功能型&#xff1a;拥有着不同的能力 2、构图型&#xff1a;控制着SD扩散图形的构图规则 Seg语义分割&#xff1a…

2025年第十届智能信息技术国际会议 (ICIIT 2025)即将召开!

第10届智能信息技术国际会议&#xff08;ICIIT 2025&#xff09;将于2025年2月20日至23日在越南河内举行。ICIIT系列会议将每年举行&#xff0c;为智能信息技术及相关领域提供互动论坛&#xff0c;除了越南的研究人员外&#xff0c;会议小组还欢迎来自世界各地的有兴趣与该地区…