自学鸿蒙HarmonyOS的ArkTS语言<五>attributeModifier动态属性和用attributeModifier封装公共组件

news2024/9/24 11:32:23

【官方文档传送门】

一、抽取组件样式
class MyModifier implements AttributeModifier<ButtonAttribute> {
  applyNormalAttribute(instance: ButtonAttribute): void {
    instance.backgroundColor(Color.Black)
    instance.width(200)
    instance.height(50)
    instance.margin(10)
    instance.labelStyle({
      font: {
        size: 20,
        style: FontStyle.Italic,
        weight: FontWeight.Bold
      },
      maxLines: 2  // 文字多了可以设置行数
    })
  }

  // 按下
  applyPressedAttribute(instance: ButtonAttribute): void {
    instance.backgroundColor(Color.Green)
  }
}

...

@State myModifier1: MyModifier = new MyModifier()

build() {
    Column(){
      Button('我是用动态属性设置的按钮我是用动态属性设置的按钮')
     	.attributeModifier(this.myModifier1)
    }
}
        

在这里插入图片描述

二、根据条件设置组件属性
class MyModifier2 implements AttributeModifier<ButtonAttribute> {
  isDark: boolean = false

  applyNormalAttribute(instance: ButtonAttribute): void {
    if (this.isDark) {
      instance.backgroundColor(Color.Black)
    } else {
      instance.backgroundColor(Color.Blue)
    }
  }
}
...

@State myModifier2: MyModifier2 = new MyModifier2()

build() {
    Column(){
      Button('我是动态改变属性按钮')
        .margin(10)
        .attributeModifier(this.myModifier2)
        .onClick(() => {
          this.myModifier2.isDark = !this.myModifier2.isDark
        })
    }
}

注意:attributeModifier不能通过state感知变化

class MyModifier3 extends  CommonModifier {

  applyNormalAttribute(instance: CommonAttribute): void {
    super.applyNormalAttribute?.(instance)
  }
}
...
@State width1: number = 250
// 不能通过绑定state的形式感知数据变化
@State myModifier3: CommonModifier = new MyModifier3().width(this.width1)

build() {
    Column(){
      Button('我是改变text的width按钮')
        .margin(10)
        .onClick(() => {
          this.width1++ // width1变化了,但是text的attributeModifier的width不会变
        })
      Text('我是text,希望attributeModifier通过state感知变化,然而并不能')
        .padding(10)
        .fontColor(Color.White)
        .backgroundColor(Color.Black)
        .attributeModifier(this.myModifier3)
    }
}
三、通过调实例方法动态改变属性
class MyModifier4 extends CommonModifier {

  applyNormalAttribute(instance: CommonAttribute): void {
    super.applyNormalAttribute?.(instance) // 必须有,否则实例化的myModifier4上的padding无效
  }

  public setGroup1():void {
    this.borderStyle(BorderStyle.Dashed)
    this.borderWidth(8)
  }

  public setGroup2():void {
    this.borderStyle(BorderStyle.Dashed)
    this.borderWidth(0)
  }
}

@Component
struct MyText1 {
  @Link modifier : CommonModifier

  build(){
    Text('我是text,是通过modifier方法改变属性的')
      .fontColor(Color.White)
      .backgroundColor(Color.Brown)
      .attributeModifier(this.modifier as MyModifier4)
  }
}
...
index : number = 0
@State myModifier4: CommonModifier = new MyModifier4().padding(10)

build(){
    Button('我是调用modifier实例方法改变text属性的')
      .margin(10)
      .onClick(() => {
        this.index++
        if(this.index %2 === 1){
          (this.myModifier4 as MyModifier4).setGroup1()
        } else {
          (this.myModifier4 as MyModifier4).setGroup2()
        }
      })

    // 这种写法不行 ????
    Text('我是text,是通过modifier方法改变属性的')
      .fontColor(Color.White)
      .backgroundColor(Color.Brown)
      .attributeModifier(this.myModifier4)

    // 必须封装成组件才行
    MyText1({modifier:this.myModifier4})
}
四、封装公共组件

A、单一系统组件的公共组件 - 提供方创建 AttributeModifier 类,使用方在组件上用类的实例作为attributeModifier属性的参数传入: Button(‘xxx’).attributeModifier(类的实例)

class MyModifier5 implements  AttributeModifier<ButtonAttribute> {
  private buttonType: ButtonType  = ButtonType.Normal
  private w: number = 50
  applyNormalAttribute(instance: ButtonAttribute): void {
    instance.type(this.buttonType)
    instance.width(this.w)
    instance.margin(10)
  }

  public setStyle(type: ButtonType): MyModifier5 {
    this.buttonType = type
    return this
  }

  public setWidth(w: number): MyModifier5 {
    this.w = w
    return this
  }
}

...

// 单个系统组件封装成公共组件
@State myModifier5: MyModifier5 = new MyModifier5().setWidth(300).setStyle(ButtonType.Capsule)
@State myModifier5_1: MyModifier5 = new MyModifier5().setWidth(200)

build(){
  Button('我是单一的公共组件')
    .attributeModifier(this.myModifier5)
  Button('我是单一的公共组件2')
    .attributeModifier(this.myModifier5_1)
}

在这里插入图片描述

B、多个系统组件组合的公共组件 - 提供方只要提供组件,并接收外部传入的 attributeModifie属性值,使用方要创建AttributeModifier类,并把实例作为参数传入组件

class ImageModifier implements AttributeModifier<ImageAttribute> {
  private imgW: Length = 0
  private imgH: Length = 0

  constructor(width: Length, height: Length) {
    this.imgW = width
    this.imgH = height
  }
  width(width: Length) {
    this.imgW = width
    return this
  }
  height(height: Length) {
    this.imgH = height
    return this
  }

  applyNormalAttribute(instance: ImageAttribute): void {
    instance.width(this.imgW)
    instance.height(this.imgH)
  }
}

class TxtModifier implements AttributeModifier<TextAttribute> {
  applyNormalAttribute(instance: TextAttribute): void {
    instance.fontSize(20)
  }
}

@Component
struct MyTextImage1 {
  @Prop imgAtt : AttributeModifier<ImageAttribute>
  @Prop txtAtt: AttributeModifier<TextAttribute>
  @Prop imgUrl: ResourceStr
  @Prop text: string

  build(){
    Column() {
      Image(this.imgUrl).attributeModifier(this.imgAtt)
      Text(this.text).attributeModifier(this.txtAtt)
    }
  }
}

...
build(){
  // 多个不同系统组件封装成公共组件
  imageModifier: ImageModifier = new ImageModifier(100, 100)
  txtModifier: TxtModifier = new TxtModifier()

  MyTextImage1({
    imgAtt: this.imageModifier,
    txtAtt: this.txtModifier,
    imgUrl: $r('app.media.book'),
    text: '我是多个系统组件封装的公共组件'
  })
}

在这里插入图片描述

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

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

相关文章

2008年上半年软件设计师【下午题】真题及答案

文章目录 2008年上半年软件设计师下午题--真题2008年上半年软件设计师下午题--答案 2008年上半年软件设计师下午题–真题 2008年上半年软件设计师下午题–答案

数字滚动动画~

前言 数字从0.00滚动到某个数值的动画 实现&#xff08;React版本&#xff09; Dom <div className"number" ref{numberRef}>0.00</div> JS const _initNumber () > {const targetNumber 15454547.69;const duration 1500;const numberElement…

[leetcode]subarray-product-less-than-k 乘积小于K的子数组

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {if (k 0) {return 0;}int n nums.size();vector<double> logPrefix(n 1);for (int i 0; i < n; i) {logPrefix[i 1] …

E. Beautiful Array(cf954div3)

题意&#xff1a;给定一个数组&#xff0c;可以先对数组进行任意排序&#xff0c;每次操作可以选择一个ai&#xff0c;将它变成aik&#xff0c; 想让这个数组变成一个美丽数组&#xff08;回文数组&#xff09;&#xff0c;求最少操作次数 分析&#xff1a; 先找出相同的数字…

Android liveData 监听异常,fragment可见时才收到回调记录

背景&#xff1a;在app的fragment不可见的情况下使用&#xff0c;发现注册了&#xff0c;但是没有回调导致数据一直未更新&#xff0c;只有在fragment可见的时候才收到回调 // 观察通用信息mLightNaviTopViewModel.getUpdateCommonInfo().observe(this, new Observer<Common…

常用的JVM启动参数

JVM的启动参数有很多&#xff0c;但是我们平常能用上的并不是特别多&#xff0c;这里介绍几个我们常用的&#xff1a; 1. 堆设置&#xff1a; 。 -Xms&#xff1a;设置堆的初始大小。 。.-Xmx&#xff1a;设置堆的最大大小。 2. 栈设置&#xff1a; 。 -XsS&#xff1a;设置每个…

国产大模型第一梯队玩家,为什么pick了CPU?

AI一天&#xff0c;人间一年。 现在不论是大模型本身&#xff0c;亦或是AI应用的更新速度简直令人直呼跟不上—— Sora、Suno、Udio、Luma……重磅应用一个接一个问世。 也正如来自InfoQ的调查数据显示的那般&#xff0c;虽然AIGC目前还处于起步阶段&#xff0c;但市场规模已…

没想到吧,Python print函数也能玩出花!

目录 1、基础打印技巧&#x1f680; 1.1 print()函数入门 1.2 格式化字符串输出 使用f-string 使用str.format() 2、高级格式化选项&#x1f3a8; 2.1 f-string动态插入变量 2.2 使用format方法 3、控制台颜色输出&#x1f308; 3.1 利用ANSI转义码 3.2 使用第三方库…

结束休刊博客真·vlog | 顺便说一下500粉的事

啊&#xff0c;首先是信 ♥亲爱的读者们&#xff0c; 在这个充满数字韵律与代码奇迹的时空里&#xff0c;我满怀激动与感激的心情&#xff0c;提笔写下这封信&#xff0c;宣布一个令人振奋的消息——经过一段时间的休整与充电&#xff0c;我终于要结束这段宝贵的休刊时光&…

Errno2:No such file or directory,在当前文件确实没有该图片,怎么解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

测试和使用Pogo-DroneCAN CANUART串口扩展模块

关键词&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;DroneCAN&#xff0c;CANUART&#xff0c;Serial over DroneCAN&#xff0c;DroneCANUART&#xff0c;UAVCAN&#xff0c;MAVlink&#xff0c;Px4 Keywords&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;D…

c语言数据结构--图综合应用实验——校院导航

实验内容&#xff1a; 面向学校&#xff0c;构建一个校院导游软件。用无向图表示所在学校的校院景点平面图&#xff0c;图中顶点表示主要景点&#xff0c;存放景点的编号、名称、简介等信息&#xff0c;图中边表示景点之间的道路&#xff0c;存放路径距离等信息。该软件具有以…

dledger原理源码分析(四)-日志

简介 dledger是openmessaging的一个组件&#xff0c; raft算法实现&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何实现raft概念&#xff0c;以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的日志&#xff0c;包括写入&#xff0c;复制…

软件架构之架构风格

软件架构之架构风格 9.3 软件架构风格9.3.1 软件架构风格分类9.3.2 数据流风格9.3.3 调用/返回风格9.3.4 独立构件风格9.3.5 虚拟机风格9.3.6 仓库风格 9.4 层次系统架构风格9.4.1 二层及三层 C/S 架构风格9.4.2 B/S 架构风格9.4.3 MVC 架构风格9.4.4 MVP 架构风格 9.5 面向服务…

力扣 双指针基础

class Solution {public void moveZeroes(int[] nums) {int l 0;//慢指针但先走for (int r 0; r < nums.length; r) {//快指针&#xff0c;遍历次数if (nums[r] 0) continue;//l比r先到&#xff0c;在此处定住l&#xff0c;r继续移动int t nums[l];nums[l] nums[r];num…

上交发布MG-LLaVA,基于多粒度指令调整,横扫视觉大模型榜单

近年来多模态大语言模型(MLLMs)在视觉理解任务中取得了长足进步。然而&#xff0c;大多数模型仍局限于处理低分辨率图像&#xff0c;这限制了它们在需要详细视觉信息的任务中的表现。针对这一问题&#xff0c;上海交通大学的研究团队推出了MG-LLaVA&#xff08;Multi-Granulari…

Animate软件基础:重命名图层或文件夹

默认情况下&#xff0c;Animate 会按照创建顺序向新图层分配名称&#xff1a;图层 1、图层 2&#xff0c;依此类推。为了更好地反映图层的内容&#xff0c;可以对图层进行重命名。 如果需要对图层或图层文件夹进行重命名&#xff0c;请执行下列操作之一&#xff1a; 双击时间轴…

二叉平衡树(左单旋,右单旋,左右双旋、右左双旋)

一、AVL树&#xff08;二叉平衡树&#xff1a;高度平衡的二叉搜索树&#xff09; 0、二叉平衡树 左右子树高度差不超过1的二叉搜索树。 public class AVLTree{static class AVLTreeNode {public TreeNode left null; // 节点的左孩子public TreeNode right null; // 节点的…

MySQL之基本查询(上)-表的增删查改

目录 Create(创建) 案例建表 插入 单行数据 指定列插入 单行数据 全列插入 多行数据 全列插入 插入是否更新 插入时更新 替换 Retrieve(读取) 建表插入 select列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 where条件 比较运算符 逻辑运…

【UE5.1 角色练习】16-枪械射击——瞄准

目录 效果 步骤 一、瞄准时拉近摄像机位置 二、瞄准偏移 三、向指定方向射击 四、连发 效果 步骤 一、瞄准时拉近摄像机位置 打开角色蓝图&#xff0c;在事件图表中添加如下节点&#xff0c;当进入射击状态时设置目标臂长度为300&#xff0c;从而拉近视角。 但是这样切…