鸿蒙开发走进多态样式stateStyles
本文基于HarmonyOSApi14
在开发中,有这样一个案例,说的是有一条条目,默认无操作状态下是一个背景颜色,手指点击后改变为另一个背景颜色,当手指松开后又还原为默认的背景颜色,我们该如何实现呢?
有的同学可能会说了,这还不是手拿把掐,利用onTouch事件就可以轻松搞定啊,手指按下就改变背景,手指抬起就还原背景,代码如下:
Column() {
Text("我是一个普通的条目")
.fontColor(Color.White)
}
.width("100%")
.height(100)
.borderRadius(10)
.justifyContent(FlexAlign.Center)
.backgroundColor(this.itemBgColor)
.onTouch((event) => {
if (event.type == TouchType.Down) {
this.itemBgColor = Color.Pink
} else if (event.type == TouchType.Up) {
this.itemBgColor = Color.Gray
}
})
实际运行后效果:
哎,还别说,还真实现了这个效果,如果不仅仅是背景颜色呢,也许在实际的开发中会有很多个属性的改变,比如宽高,边距等等,那么我们就需要很多个属性进行赋值,此种写法上,除了实现onTouch方法,还需要定义可变化的变量才能切换我们的状态,代码上显得稍显冗余,有没有一种简洁的方式,直接更改属性呢,当然是有的,这就是stateStyles。
我们把以上的代码,使用stateStyles来实现一下,代码如下:
Column() {
Text("我是一个普通的条目")
.fontColor(Color.White)
}
.width("100%")
.height(100)
.borderRadius(10)
.justifyContent(FlexAlign.Center)
.stateStyles({
pressed: { //按压
.backgroundColor(Color.Pink)
},
normal: { //正常态
.backgroundColor(Color.Gray)
}
})
以上的代码运行之后,可以发现效果和上边的onTouch是一模一样的。
什么是stateStyles?
stateStyles是多态样式,官方解读为可以依据组件的内部状态的不同,快速设置不同样式,比如组件的宽高,背景,边距等等,支持组件自身的所有的属性,目前支持的状态有五种,分别是:focused:获焦态、normal:正常态、pressed:按压态、disabled:不可用态、selected:选中态。
具体的使用场景,主要涉及多状态的切换场景,比如前边背景切换的案例,我们需要知道的是,它是支持组件自身的所有属性的,比如我们再增加一下其他的属性:
.stateStyles({
pressed: { //按压
.backgroundColor(Color.Pink)
.width("100%")
},
normal: { //正常态
.backgroundColor(Color.Gray)
.width("80%")
}
})
我们看下效果:
如果修改的样式比较多,stateStyles可以结合@Styles装饰器一起来使用,比如上面的案例,我们修改一下:
@Styles
normalStyle() {
.backgroundColor(Color.Gray)
.width("80%")
}
@Styles
pressedStyle() {
.backgroundColor(Color.Pink)
.width("100%")
}
具体使用方式如下:
.stateStyles({
pressed: this.pressedStyle,
normal: this.normalStyle
})
disabled状态,只有设置了组件禁用参会进行展示,比如下面的案例,设置了组件禁用:
.enabled(false)
.stateStyles({
disabled: {
.backgroundColor(Color.Blue)
}
})
运行之后,展示的背景颜色就是蓝色的。
除了以上的三种状态外,我们再介绍一个状态selected,它一般适用于可选择的组件,比如Checkbox,Radio等,目前支持的组件如下:
我们简单列举一个例子:
Radio({ value: 'radio', group: 'radioGroup' })
.checked(this.isChecked)
.height(50)
.width(50)
.borderWidth(0)
.borderRadius(30)
.onClick(() => {
this.isChecked = !this.isChecked
})
.radioStyle({ checkedBackgroundColor: Color.Pink })
.stateStyles({
normal: {
.backgroundColor(Color.Gray)
},
selected: {
.backgroundColor(Color.Pink)
}
})
简单总结
在使用多态样式stateStyles的时候,需要注意一点,那就是当clicked和pressed同时在一个组件上使用时,只有后注册的状态才能生效。
文章标签:HarmonyOS语言,ArkUI
- 0回答
- 0粉丝
- 0关注
- 鸿蒙开发:走进stateStyles多态样式
- 鸿蒙开发:组件样式的复用
- 鸿蒙开发中的组件样式复用
- (二五)HarmonyOS Design 的多态控件
- 鸿蒙Next 组件样式封装
- 第十八:HarmonyOS Next动态样式与主题开发实战
- 给Web开发者的HarmonyOS指南01-文本样式
- 给Web开发者的HarmonyOS指南02-布局样式
- 第二课:HarmonyOS Next样式与主题开发指南
- (三三)HarmonyOS Design 的动态样式与主题:动态主题切换与样式动态绑定
- 22.HarmonyOS Next CustomSlider组件样式自定义教程(四)
- 191.HarmonyOS NEXT系列教程之图案锁样式配置详解
- HarmonyOS NEXT实战:自定义封装多种样式导航栏组件
- 129.HarmonyOS NEXT 数字滚动示例详解(四):样式与主题适配
- 06.HarmonyOS Next UI进阶:Text组件与视觉样式完全指南