1. 程式人生 > 其它 >4️⃣通過編寫計算器學習ArkUI元件

4️⃣通過編寫計算器學習ArkUI元件

注:轉自Tuer白曉明,原文地址:https://ost.51cto.com/posts/10723

本系列文章共有五篇,細緻描述瞭如何學習ArkUI元件實現計算器的功能,以下為正文

3.8 Text元件

在前面的小節中無論是自定義按鈕還是元件示例中都用了Text元件,用於呈現一段文字資訊,描述各自的作用,Text元件是應用程式中最常見的元件。

@Entry
@Component
struct TextExample {
  build() {
    Column({space: 15}) {
      Text('多行文字的文字對齊方式').fontSize(16).fontColor('#999')
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件。')
        .fontSize(14).textAlign(TextAlign.Center).border({width: 1}).padding(8)
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件')
        .fontSize(14).textAlign(TextAlign.Start).border({width: 1}).padding(8)
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件')
        .fontSize(14).textAlign(TextAlign.End).border({width: 1}).padding(8)

      Text('設定文字超長時的顯示方式').fontSize(16).fontColor('#999')
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件。')
        .fontSize(14).textOverflow({overflow: TextOverflow.None})
        .border({width: 1}).padding(8)
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件。')
        .fontSize(14).textOverflow({overflow: TextOverflow.Clip})
        .maxLines(1).border({width: 1}).padding(8)
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件。')
        .fontSize(14).textOverflow({overflow: TextOverflow.Ellipsis})
        .maxLines(1).border({width: 1}).padding(8)

      Text('設定文字的文字行高').fontSize(16).fontColor('#999')
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件。')
        .fontSize(14).lineHeight(16).border({width: 1}).padding(8)

      Text('設定文字裝飾線及其顏色').fontSize(16).fontColor('#999')
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件。')
        .fontSize(14).decoration({type: TextDecorationType.Overline, color: Color.Blue})
        .border({width: 1}).padding(8)
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件。')
        .fontSize(14).decoration({type: TextDecorationType.Underline, color: Color.Blue})
        .border({width: 1}).padding(8)
      Text('`Text`元件,用於呈現一段文字資訊,描述各自的作用,`Text`元件是應用程式中最常見的元件。')
        .fontSize(14).decoration({type: TextDecorationType.LineThrough, color: Color.Blue})
        .border({width: 1}).padding(8)
    }
    .width('100%')
    .height('100%')
  }
}
 

3.9 標準計算器顯示區

在實戰標準計算器設計中,顯示區域是上下兩個Text元件,居上Text顯示點選功能按鈕區的錄入資訊,居下Text顯示計算結果。


      // 回顯及結果顯示區
      Flex({direction: FlexDirection.Column}) {
        Text('23+24+5').fontSize(24).fontColor('#999999')
          .textAlign(TextAlign.End)
          .width('100%')
          .height(60)
          .alignSelf(ItemAlign.Center)
          .padding({left: 10, right: 10})
        Text('52').fontSize(28).fontColor('#444444')
          .textAlign(TextAlign.End)
          .width('100%')
          .height(60)
          .alignSelf(ItemAlign.Center)
          .padding({left: 10, right: 10})
      }
      .width('100%')
      .height(120)
      .backgroundColor('#FFFFFF')
 


3.10 使用ColumnRow容器元件、Button元件實現功能按鈕區

使用前面已經掌握的Column容器元件、Row容器元件以及Button元件實現功能按鈕區,程式碼如下:

      // 功能按鈕、符號按鈕、數字按鈕
      Flex({direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center}) {
        Column({space: 20}) {
          Row({space: 20}) {
            Button('MC', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#7D7B7B').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('M+', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#7D7B7B').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('M-', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#7D7B7B').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('MR', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#7D7B7B').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
          }
          Row({space: 20}) {
            Button('C', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor(0x1296DB).fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('÷', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(32).fontColor(0x1296DB).fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('×', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(32).fontColor(0x1296DB).fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('⇐', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(32).fontColor(0x1296DB).fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
          }
          Row({space: 20}) {
            Button('7', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('8', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('9', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('-', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(32).fontColor(0x1296DB).fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
          }
          Row({space: 20}) {
            Button('4', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('5', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('6', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
            Button('+', {type: ButtonType.Circle})
              .width(64).height(64)
              .fontSize(32).fontColor('#1296DB').fontWeight(FontWeight.Bold)
              .backgroundColor('#FFFDFD')
              .borderRadius(32)
              .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
          }
          Row({space: 20}) {
            Column({space: 20}) {
              Row({space: 20}) {
                Button('1', {type: ButtonType.Circle})
                  .width(64).height(64)
                  .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
                  .backgroundColor('#FFFDFD')
                  .borderRadius(32)
                  .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
                Button('2', {type: ButtonType.Circle})
                  .width(64).height(64)
                  .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
                  .backgroundColor('#FFFDFD')
                  .borderRadius(32)
                  .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
                Button('3', {type: ButtonType.Circle})
                  .width(64).height(64)
                  .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
                  .backgroundColor('#FFFDFD')
                  .borderRadius(32)
                  .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
              }
              Row({space: 20}) {
                Button('%', {type: ButtonType.Circle})
                  .width(64).height(64)
                  .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
                  .backgroundColor('#FFFDFD')
                  .borderRadius(32)
                  .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
                Button('0', {type: ButtonType.Circle})
                  .width(64).height(64)
                  .fontSize(20).fontColor('#000').fontWeight(FontWeight.Bold)
                  .backgroundColor('#FFFDFD')
                  .borderRadius(32)
                  .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
                Button('.', {type: ButtonType.Circle})
                  .width(64).height(64)
                  .fontSize(32).fontColor('#000').fontWeight(FontWeight.Bold)
                  .backgroundColor('#FFFDFD')
                  .borderRadius(32)
                  .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})
              }
            }
            Column({space: 20}) {
              Button('=', {type: ButtonType.Capsule})
                .width(64).height(148)
                .fontSize(32).fontColor(0x1296DB).fontWeight(FontWeight.Bold)
                .backgroundColor('#FFFDFD')
                .borderRadius(32)
                .shadow({radius: 16, color: 0x7D7B7B, offsetX: 0, offsetY: 2})

            }.margin({left: -20})
          }
        }
        .padding({left: 20})
      }
      .width('100%')
      .borderRadius(8)
      .backgroundColor('#F2F2F2')
 



是不是看起來程式碼很多,每個Button除了內容,及個別顏色和字型大小不一樣之外,其他的都是一樣的呢?可以思考以下,如何抽出公用的自定義Button元件,根據傳參不同顯示不同的按鈕,這部分會在後面的小節中分享。學習之初先是多用,用熟了,才是靈活使用。

思考

在實現功能按鈕區的時候,我給Column容器元件添加了padding({left: 20})這個屬性,其代表什麼含義?解決了什麼問題?你還有沒有其他的方法?

小結

本節先對Text文字元件的用法做了簡單介紹,然後通過之前小節中學習的ColumnRowButton元件實現了標準計算器的功能按鈕區。下一小節將帶你一起實現標準計算器的計算功能和計算曆史留存。