1# 按钮 2 3 4Button是按钮组件,通常用于响应用户的点击操作,其类型包括胶囊按钮、圆形按钮、普通按钮。Button当做为容器使用时可以通过添加子组件实现包含文字、图片等元素的按钮。具体用法请参考[Button](../reference/arkui-ts/ts-basic-components-button.md)。 5 6 7## 创建按钮 8 9Button通过调用接口来创建,接口调用有以下两种形式: 10 11 12- 创建不包含子组件的按钮。 13 14 ```ts 15 Button(label?: string, options?: { type?: ButtonType, stateEffect?: boolean }) 16 ``` 17 18 该接口用于创建不包含子组件的按钮,其中label用来设置按钮文字,type用于设置Button类型,stateEffect属性设置Button是否开启点击效果。 19 20 ```ts 21 Button('Ok', { type: ButtonType.Normal, stateEffect: true }) 22 .borderRadius(8) 23 .backgroundColor(0x317aff) 24 .width(90) 25 .height(40) 26 ``` 27 28 ![zh-cn_image_0000001562820757](figures/zh-cn_image_0000001562820757.png) 29 30 31- 创建包含子组件的按钮。 32 33 ```ts 34 Button(options?: {type?: ButtonType, stateEffect?: boolean}) 35 ``` 36 37 该接口用于创建包含子组件的按钮,只支持包含一个子组件,子组件可以是[基础组件](../reference/arkui-ts/ts-basic-components-blank.md)或者[容器组件](../reference/arkui-ts/ts-container-ability-component.md)。 38 39 ```ts 40 Button({ type: ButtonType.Normal, stateEffect: true }) { 41 Row() { 42 Image($r('app.media.loading')).width(20).height(40).margin({ left: 12 }) 43 Text('loading').fontSize(12).fontColor(0xffffff).margin({ left: 5, right: 12 }) 44 }.alignItems(VerticalAlign.Center) 45 }.borderRadius(8).backgroundColor(0x317aff).width(90).height(40) 46 ``` 47 48 ![zh-cn_image_0000001511421216](figures/zh-cn_image_0000001511421216.png) 49 50 51## 设置按钮类型 52 53Button有三种可选类型,分别为Capsule(胶囊类型)、Circle(圆形按钮)和Normal(普通按钮),通过type进行设置。 54 55 56- 胶囊按钮(默认类型) 57 此类型按钮的圆角自动设置为高度的一半,不支持通过borderRadius属性重新设置圆角。 58 59 ```ts 60 Button('Disable', { type: ButtonType.Capsule, stateEffect: false }) 61 .backgroundColor(0x317aff) 62 .width(90) 63 .height(40) 64 ``` 65 66 ![zh-cn_image_0000001511421208](figures/zh-cn_image_0000001511421208.png) 67 68 69- 圆形按钮 70 此类型按钮为圆形,不支持通过borderRadius属性重新设置圆角。 71 72 ```ts 73 Button('Circle', { type: ButtonType.Circle, stateEffect: false }) 74 .backgroundColor(0x317aff) 75 .width(90) 76 .height(90) 77 ``` 78 79 ![zh-cn_image_0000001511740428](figures/zh-cn_image_0000001511740428.png) 80 81- 普通按钮 82 此类型的按钮默认圆角为0,支持通过borderRadius属性重新设置圆角。 83 84 ```ts 85 Button('Ok', { type: ButtonType.Normal, stateEffect: true }) 86 .borderRadius(8) 87 .backgroundColor(0x317aff) 88 .width(90) 89 .height(40) 90 ``` 91 92 ![zh-cn_image_0000001563060641](figures/zh-cn_image_0000001563060641.png) 93 94 95## 自定义样式 96 97- 设置边框弧度。 98 一般使用通用属性来自定义按钮样式。例如通过borderRadius属性设置按钮的边框弧度。 99 100 ```ts 101 Button('circle border', { type: ButtonType.Normal }) 102 .borderRadius(20) 103 .height(40) 104 ``` 105 106 ![zh-cn_image_0000001511900392](figures/zh-cn_image_0000001511900392.png) 107 108 109- 设置文本样式。 110 通过添加文本样式设置按钮文本的展示样式。 111 112 ```ts 113 Button('font style', { type: ButtonType.Normal }) 114 .fontSize(20) 115 .fontColor(Color.Pink) 116 .fontWeight(800) 117 ``` 118 119 ![zh-cn_image_0000001511580828](figures/zh-cn_image_0000001511580828.png) 120 121 122- 设置背景颜色。 123 添加backgroundColor属性设置按钮的背景颜色。 124 125 ```ts 126 Button('background color').backgroundColor(0xF55A42) 127 ``` 128 129 ![zh-cn_image_0000001562940477](figures/zh-cn_image_0000001562940477.png) 130 131 132- 用作功能型按钮。 133 为删除操作创建一个按钮。 134 135 ```ts 136 Button({ type: ButtonType.Circle, stateEffect: true }) { 137 Image($r('app.media.ic_public_delete_filled')).width(30).height(30) 138 }.width(55).height(55).margin({ left: 20 }).backgroundColor(0xF55A42) 139 ``` 140 141 ![zh-cn_image_0000001511740436](figures/zh-cn_image_0000001511740436.png) 142 143 144## 添加事件 145 146Button组件通常用于触发某些操作,可以绑定onClick事件来响应点击操作后的自定义行为。 147 148```ts 149Button('Ok', { type: ButtonType.Normal, stateEffect: true }) 150 .onClick(()=>{ 151 console.info('Button onClick') 152 }) 153``` 154 155 156## 场景示例 157 158- 用于启动操作。 159 可以用按钮启动任何用户界面元素,按钮会根据用户的操作触发相应的事件。例如,在List容器里通过点击按钮进行页面跳转。 160 161 ```ts 162 // xxx.ets 163 import router from '@ohos.router'; 164 @Entry 165 @Component 166 struct ButtonCase1 { 167 build() { 168 List({ space: 4 }) { 169 ListItem() { 170 Button("First").onClick(() => { 171 router.pushUrl({ url: 'pages/first_page' }) 172 }) 173 .width('100%') 174 } 175 ListItem() { 176 Button("Second").onClick(() => { 177 router.pushUrl({ url: 'pages/second_page' }) 178 }) 179 .width('100%') 180 } 181 ListItem() { 182 Button("Third").onClick(() => { 183 router.pushUrl({ url: 'pages/third_page' }) 184 }) 185 .width('100%') 186 } 187 } 188 .listDirection(Axis.Vertical) 189 .backgroundColor(0xDCDCDC).padding(20) 190 } 191 } 192 ``` 193 194 ![zh-cn_image_0000001562700393](figures/zh-cn_image_0000001562700393.png) 195 196 197- 用于表单的提交。 198 在用户登录/注册页面,使用按钮进行登录或注册操作。 199 200 ```ts 201 // xxx.ets 202 @Entry 203 @Component 204 struct ButtonCase2 { 205 build() { 206 Column() { 207 TextInput({ placeholder: 'input your username' }).margin({ top: 20 }) 208 TextInput({ placeholder: 'input your password' }).type(InputType.Password).margin({ top: 20 }) 209 Button('Register').width(300).margin({ top: 20 }) 210 .onClick(() => { 211 // 需要执行的操作 212 }) 213 }.padding(20) 214 } 215 } 216 ``` 217 218 ![zh-cn_image_0000001562940473](figures/zh-cn_image_0000001562940473.png) 219 220- 悬浮按钮 221 在可以滑动的界面,滑动时按钮始终保持悬浮状态。 222 223 ```ts 224 // xxx.ets 225 @Entry 226 @Component 227 struct HoverButtonExample { 228 private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 229 build() { 230 Stack() { 231 List({ space: 20, initialIndex: 0 }) { 232 ForEach(this.arr, (item) => { 233 ListItem() { 234 Text('' + item) 235 .width('100%').height(100).fontSize(16) 236 .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF) 237 } 238 }, item => item) 239 }.width('90%') 240 Button() { 241 Image($r('app.media.ic_public_add')) 242 .width(50) 243 .height(50) 244 } 245 .width(60) 246 .height(60) 247 .position({x: '80%', y: 600}) 248 .shadow({radius: 10}) 249 .onClick(() => { 250 // 需要执行的操作 251 }) 252 } 253 .width('100%') 254 .height('100%') 255 .backgroundColor(0xDCDCDC) 256 .padding({ top: 5 }) 257 } 258 } 259 ``` 260 261 ![GIF](figures/GIF.gif) 262