[文章]如何使用HarmonyOS实现一个简单的计算器应用

阅读量0
0
4
1. 介绍      本文档将为大家介绍如何使用HarmonyOS实现一个简单的计算器应用。该应用支持简单的加、减、乘、除以及取余运算。
图1-1 计算器交互界面         

   

2. 搭建HarmonyOS环境      

我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。
  • 安装DevEco Studio,详情请参考下载和安装软件。
  • 设置DevEco Studio开发环境,DevEco Studio开发环境依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
    • 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
    • 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。
  • 开发者可以参考以下链接,完成设备调试的相关配置:
    • 使用真机进行调试
    • 使用模拟器进行调试
您可以利用如下设备完成Codelab:
  • 开启了开发者模式的HarmonyOS真机或DevEco Studio自带模拟器。

    本篇文章使用的DevEco Studio版本为DevEco Studio 2.1 Beta4,使用的SDK版本为API Version 5。
3. 代码结构解读      本教程会对计算器应用的核心代码进行解读,首先为大家介绍整个工程的代码结构。

  • slice
    • MainAbilitySlice:计算器交互界面,用于完成界面元素渲染、按钮事件绑定动作。
  • utils
    • MathUtil:用于计算表达式结果的工具类,封装有运算符权重获取、表达式计算等方法。
  • resources
    • resourcesbaselayout:存放xml布局文件。
    • resourcesbasemedia:存放图片资源文件。
    • resourcesbasegraphic:存放xml样式文件。
  • MainAbility:HAP的入口ability,由DevEco Studio自动生成。
  • MyApplication:表示HAP的类,由DevEco Studio自动生成。
  • config.json:应用的配置文件,由DevEco Studio自动生成。
   
4. 应用初始化      

计算器应用使用的是自定义的按键,为避免用户在输入数学表达式时,系统自动弹出软键盘,本应用在初始化时,会在入口类MainAbility禁止应用弹出软键盘。
  1. // 禁止软键盘弹出
  2. getWindow().setLayoutFlags(WindowManager.LayoutConfig.MARK_ALT_FOCUSABLE_IM,
  3. WindowManager.LayoutConfig.MARK_ALT_FOCUSABLE_IM);
复制代码
随后会在计算器交互界面类MainAbilitySlice中,完成界面渲染和按键点击事件绑定。
  1. [url=home.php?mod=space&uid=2735960]@Override[/url]
  2. public void onStart(Intent intent) {
  3.     super.onStart(intent);
  4.     super.setUIContent(ResourceTable.Layout_ability_main);

  5.     initView();
  6.     initListener();
  7. }
复制代码
本示例的完整代码会在本教程的"完整示例"章节中给出,其他章节仅对核心代码进行讲解说明。

5. 算法表达式计算      

用户通过点击按键,输入要进行计算的数学表达式。用户每次输入新的字符,应用都会获取当前的表达式字符串,并判断是否需要进行计算。
  1. private void calculateResult(String exp, Boolean isAutoCalculate) {
  2.     if (exp.isEmpty()) {
  3.         return;
  4.     }
  5.     // 只有数字 不计算
  6.     String pattern = "(\d*\.?\d*)|(0\.\d*[1-9])";
  7.     boolean isMatch = Pattern.matches(pattern, exp);
  8.     if (isMatch) {
  9.         return;
  10.     }
  11.     // 末位是运算符 不计算
  12.     if (MathUtil.isOperator(exp.substring(exp.length() - 1))) {
  13.         return;
  14.     }

  15.     String resultValue;
  16.     try {
  17.         resultValue = MathUtil.getResultString(exp);
  18.     } catch (NumberFormatException | ArithmeticException | EmptyStackException e) {
  19.         preResult.setText("错误");
  20.         return;
  21.     }

  22.     if (isAutoCalculate) {
  23.         preResult.setText(resultValue);
  24.         return;
  25.     }
  26.     preResult.setText("");
  27.     inputText.setText(resultValue);     
  28. }
复制代码
若数学表达式字符串经过检查后,需要进行计算。程序则会调用MathUtil中的getResultString方法,对表达式进行计算。
步骤 1 -  把表达式拆分为数字和运算符,分别存放在两个栈中。
  1. Stack<String> numStack = new Stack<>();
  2. numStack.push(separateStr); // 数字用@分开,数字栈中@号 为了便于区分小数
  3. Stack<String> oprStack = new Stack<>();
复制代码

步骤 2 -  数字直接入数字栈。
  1. for (String singleStr : strings) {
  2.     if (isOperator(singleStr)) {
  3.         spiltExp(numStack, oprStack, singleStr);
  4.     } else {
  5.         numStack.push(singleStr);
  6.     }
  7. }
复制代码

步骤 3 -  如果是运算符,且当前运算符优先级小于等于栈中前一个运算符,则数字栈弹出两个数值,符号栈弹出一个运算符进行计算,计算结果入数字栈,当前运算符入符号栈;若当前运算符优先级大于栈中前一个运算符,则当前符号直接入栈。
  1. private static void spiltExp(Stack<String> numStack, Stack<String> oprStack, String singleStr) {
  2.     // 运算符间的字符拼接成一个数字
  3.     combineString(numStack);
  4.     if (!oprStack.isEmpty()) {
  5.         // 先处理优先级高的运算符
  6.         while (!oprStack.isEmpty() && priority(singleStr) <= priority(oprStack.peek())) {
  7.             combineString(numStack);
  8.             compute(numStack, oprStack);
  9.         }
  10.     }
  11.     oprStack.push(singleStr);
  12. }
复制代码

步骤 4 -  依次取出数字栈两个数值和符号栈的一个运算符,依次运算,结果入数字栈。
  1. private static void compute(Stack<String> numStack, Stack<String> oprStack) {
  2.     BigDecimal result = null;

  3.     numStack.pop();
  4.     BigDecimal rightNumber = new BigDecimal(numStack.pop());

  5.     numStack.pop();
  6.     BigDecimal leftNumber = new BigDecimal(numStack.pop());

  7.     String operator = oprStack.pop();
  8.     switch (operator) {
  9.         case "-":
  10.             result = leftNumber.subtract(rightNumber);
  11.             break;
  12.         case "+":
  13.             result = leftNumber.add(rightNumber);
  14.             break;
  15.         case "%":
  16.             result = leftNumber.divideAndRemainder(rightNumber)[1];
  17.             break;
  18.         case "×":
  19.             result = leftNumber.multiply(rightNumber);
  20.             break;
  21.         case "÷":
  22.             result = leftNumber.divide(rightNumber, DECIMAL_DIGIT, BigDecimal.ROUND_HALF_UP);
  23.             break;
  24.         default:
  25.             break;
  26.     }
  27.     numStack.push(result.stripTrailingZeros().toPlainString());
  28.     numStack.push(separateStr);
  29. }
复制代码

步骤 5 -  最后符号栈为空,数字栈只有一个数字,即为最终计算结果。
  1. while (!oprStack.isEmpty()) {
  2.     combineString(numStack);
  3.     compute(numStack, oprStack);
  4. }
  5. numStack.pop();
  6. String resultValue = numStack.peek();
复制代码

6. 完整示例      MainAbility
  1. package com.huawei.cookbook;

  2. import com.huawei.cookbook.slice.MainAbilitySlice;

  3. import ohos.aafwk.ability.Ability;
  4. import ohos.aafwk.content.Intent;
  5. import ohos.agp.window.service.WindowManager;

  6. /**
  7. * MainAbility
  8. *
  9. * @since 2021-04-29
  10. */
  11. public class MainAbility extends Ability {
  12.     @Override
  13.     public void onStart(Intent intent) {
  14.         // 禁止软键盘弹出
  15.         getWindow().setLayoutFlags(WindowManager.LayoutConfig.MARK_ALT_FOCUSABLE_IM,
  16.                 WindowManager.LayoutConfig.MARK_ALT_FOCUSABLE_IM);
  17.         super.onStart(intent);
  18.         super.setMainRoute(MainAbilitySlice.class.getName());
  19.     }
  20. }
复制代码
MainAbilitySlice
  1. package com.huawei.cookbook.slice;

  2. import com.huawei.cookbook.ResourceTable;
  3. import com.huawei.cookbook.utils.MathUtil;

  4. import ohos.aafwk.ability.AbilitySlice;
  5. import ohos.aafwk.content.Intent;
  6. import ohos.agp.components.Component;
  7. import ohos.agp.components.Text;
  8. import ohos.agp.components.TextField;

  9. import java.util.EmptyStackException;
  10. import java.util.regex.Pattern;

  11. /**
  12. * MainAbilitySlice
  13. *
  14. * @since 2021-04-29
  15. */
  16. public class MainAbilitySlice extends AbilitySlice {
  17.     /**
  18.      * number component
  19.      */
  20.     private static int[] numberComponentIds = {ResourceTable.Id_seven, ResourceTable.Id_eight, ResourceTable.Id_nine,
  21.         ResourceTable.Id_four, ResourceTable.Id_five, ResourceTable.Id_six, ResourceTable.Id_one,
  22.         ResourceTable.Id_two, ResourceTable.Id_three, ResourceTable.Id_zero, ResourceTable.Id_radix_point
  23.     };

  24.     /**
  25.      * operator component
  26.      */
  27.     private static int[] operatorComponentIds = {ResourceTable.Id_divide, ResourceTable.Id_multiply,
  28.         ResourceTable.Id_minus, ResourceTable.Id_divide_remainder, ResourceTable.Id_plus
  29.     };

  30.     private TextField inputText;
  31.     private Text preResult;

  32.     @Override
  33.     public void onStart(Intent intent) {
  34.         super.onStart(intent);
  35.         super.setUIContent(ResourceTable.Layout_ability_main);
  36.         initView();
  37.         initListener();
  38.     }

  39.     private void initView() {
  40.         if (findComponentById(ResourceTable.Id_input_text) instanceof TextField) {
  41.             inputText = (TextField) findComponentById(ResourceTable.Id_input_text);
  42.             inputText.requestFocus();
  43.         }
  44.         if (findComponentById(ResourceTable.Id_pre_result) instanceof Text) {
  45.             preResult = (Text) findComponentById(ResourceTable.Id_pre_result);
  46.         }
  47.     }

  48.     private void initListener() {
  49.         findComponentById(ResourceTable.Id_number_cancel).setClickedListener(new Component.ClickedListener() {
  50.             @Override
  51.             public void onClick(Component component) {
  52.                 preResult.setText("");
  53.                 inputText.setText("");
  54.             }
  55.         });

  56.         findComponentById(ResourceTable.Id_delete).setClickedListener(new Component.ClickedListener() {
  57.             @Override
  58.             public void onClick(Component component) {
  59.                 if (inputText.getText().isEmpty()) {
  60.                     return;
  61.                 }
  62.                 inputText.setText(inputText.getText().substring(0, inputText.getText().length() - 1));
  63.             }
  64.         });

  65.         findComponentById(ResourceTable.Id_equal_sign).setClickedListener(new Component.ClickedListener() {
  66.             @Override
  67.             public void onClick(Component component) {
  68.                 calculateResult(inputText.getText(), false);
  69.             }
  70.         });

  71.         for (int componentId : numberComponentIds) {
  72.             findComponentById(componentId).setClickedListener(new Component.ClickedListener() {
  73.                 @Override
  74.                 public void onClick(Component component) {
  75.                     bindNumberClickListener(componentId);
  76.                 }
  77.             });
  78.         }

  79.         for (int componentId : operatorComponentIds) {
  80.             findComponentById(componentId).setClickedListener(new Component.ClickedListener() {
  81.                 @Override
  82.                 public void onClick(Component component) {
  83.                     bindOperatorClickListener(componentId);
  84.                 }
  85.             });
  86.         }
  87.     }

  88.     private void bindNumberClickListener(int componentId) {
  89.         String oldValue = inputText.getText();
  90.         String inputValue = "";
  91.         if (findComponentById(componentId) instanceof Text) {
  92.             Text text = (Text) findComponentById(componentId);
  93.             inputValue = text.getText();
  94.         }

  95.         if (oldValue.isEmpty() && ".".equals(inputValue)) {
  96.             return;
  97.         }
  98.         if ("0".equals(oldValue) && !".".equals(inputValue)) {
  99.             inputText.setText(inputValue);
  100.         } else {
  101.             inputText.append(inputValue);
  102.         }
  103.         calculateResult(inputText.getText(), true);
  104.     }

  105.     private void bindOperatorClickListener(int componentId) {
  106.         String oldValue = inputText.getText();
  107.         String inputValue = "";
  108.         if (findComponentById(componentId) instanceof Text) {
  109.             Text text = (Text) findComponentById(componentId);
  110.             inputValue = text.getText();
  111.         }
  112.         if (oldValue.isEmpty()) {
  113.             inputText.setText(inputValue);
  114.         } else if (MathUtil.isOperator(oldValue.substring(oldValue.length() - 1))
  115.                 && MathUtil.isOperator(inputValue)) {
  116.             String newValue = oldValue.substring(0, oldValue.length() - 1) + inputValue;
  117.             inputText.setText(newValue);
  118.         } else {
  119.             inputText.append(inputValue);
  120.         }
  121.         calculateResult(inputText.getText(), true);
  122.     }

  123.     private void calculateResult(String exp, Boolean isAutoCalculate) {
  124.         if (exp.isEmpty()) {
  125.             return;
  126.         }
  127.         // 只有数字 不计算
  128.         String pattern = "(\d*\.?\d*)|(0\.\d*[1-9])";
  129.         boolean isMatch = Pattern.matches(pattern, exp);
  130.         if (isMatch) {
  131.             return;
  132.         }
  133.         // 末位是运算符 不计算
  134.         if (MathUtil.isOperator(exp.substring(exp.length() - 1))) {
  135.             return;
  136.         }

  137.         String resultValue;
  138.         try {
  139.             resultValue = MathUtil.getResultString(exp);
  140.         } catch (NumberFormatException | ArithmeticException | EmptyStackException e) {
  141.             preResult.setText("错误");
  142.             return;
  143.         }

  144.         if (isAutoCalculate) {
  145.             preResult.setText(resultValue);
  146.             return;
  147.         }
  148.         preResult.setText("");
  149.         inputText.setText(resultValue);
  150.     }

  151.     @Override
  152.     public void onActive() {
  153.         super.onActive();
  154.     }

  155.     @Override
  156.     public void onForeground(Intent intent) {
  157.         super.onForeground(intent);
  158.     }
  159. }
复制代码
MathUtil
  1. package com.huawei.cookbook.utils;

  2. import java.math.BigDecimal;
  3. import java.util.Stack;

  4. /**
  5. * MathUtil
  6. *
  7. * @since 2021-04-29
  8. */
  9. public class MathUtil {
  10.     // 数字栈中分隔数字时使用
  11.     private static String separateStr = "@";

  12.     // 保留小数位数
  13.     private static final int DECIMAL_DIGIT = 6;

  14.     // 不包含指定字符
  15.     private static final int NOT_CONTAIN = -1;

  16.     // 高优先级
  17.     private static final int HIGH_PRIORITY = 2;

  18.     // 低优先级
  19.     private static final int LOW_PRIORITY = 1;

  20.     private MathUtil() {
  21.     }

  22.     /**
  23.      * thinking:
  24.      * 1.Split the expression into numbers and operators, and store them in two stacks.
  25.      * 2.Numbers directly into the digital stack
  26.      * 3.If the priority is less than or equal to the previous operator in the stack, the
  27.      * calculation result is stored in the digit stack, and the current operator is stored in the symbol stack.
  28.      * If the priority is higher than that of the previous operator in the stack, the current symbol is directly
  29.      * added to the stack.
  30.      * 4.Obtain the two values of the digit stack and an operator of the symbol stack in sequence, perform operations
  31.      * in sequence, and import the results into the digit stack.
  32.      * 5.The final symbol stack is empty and the number stack contains only one digit, which is the final calculation
  33.      * result.
  34.      *
  35.      * [url=home.php?mod=space&uid=3142012]@param[/url] exp Mathematical Expression String
  36.      * [url=home.php?mod=space&uid=1141835]@Return[/url] Calculation result string
  37.      */
  38.     public static String getResultString(String exp) {
  39.         Stack<String> numStack = new Stack<>();
  40.         numStack.push(separateStr); // 数字用@分开,数字栈中@号 为了便于区分小数
  41.         Stack<String> oprStack = new Stack<>();

  42.         String[] strings = exp.split("");
  43.         for (String singleStr : strings) {
  44.             if (isOperator(singleStr)) {
  45.                 spiltExp(numStack, oprStack, singleStr);
  46.             } else {
  47.                 numStack.push(singleStr);
  48.             }
  49.         }
  50.         while (!oprStack.isEmpty()) {
  51.             combineString(numStack);
  52.             compute(numStack, oprStack);
  53.         }
  54.         numStack.pop();
  55.         String resultValue = numStack.peek();
  56.         return resultValue;
  57.     }

  58.     private static void spiltExp(Stack<String> numStack, Stack<String> oprStack, String singleStr) {
  59.         // 运算符间的字符拼接成一个数字
  60.         combineString(numStack);
  61.         if (!oprStack.isEmpty()) {
  62.             // 先处理优先级高的运算符
  63.             while (!oprStack.isEmpty() && priority(singleStr) <= priority(oprStack.peek())) {
  64.                 combineString(numStack);
  65.                 compute(numStack, oprStack);
  66.             }
  67.         }
  68.         oprStack.push(singleStr);
  69.     }

  70.     private static void compute(Stack<String> numStack, Stack<String> oprStack) {
  71.         BigDecimal result = null;

  72.         numStack.pop();
  73.         BigDecimal rightNumber = new BigDecimal(numStack.pop());

  74.         numStack.pop();
  75.         BigDecimal leftNumber = new BigDecimal(numStack.pop());

  76.         String operator = oprStack.pop();
  77.         switch (operator) {
  78.             case "-":
  79.                 result = leftNumber.subtract(rightNumber);
  80.                 break;
  81.             case "+":
  82.                 result = leftNumber.add(rightNumber);
  83.                 break;
  84.             case "%":
  85.                 result = leftNumber.divideAndRemainder(rightNumber)[1];
  86.                 break;
  87.             case "×":
  88.                 result = leftNumber.multiply(rightNumber);
  89.                 break;
  90.             case "÷":
  91.                 result = leftNumber.divide(rightNumber, DECIMAL_DIGIT, BigDecimal.ROUND_HALF_UP);
  92.                 break;
  93.             default:
  94.                 break;
  95.         }
  96.         numStack.push(result.stripTrailingZeros().toPlainString());
  97.         numStack.push(separateStr);
  98.     }

  99.     private static void combineString(Stack<String> stack) {
  100.         if (separateStr.equals(stack.peek())) {
  101.             return;
  102.         }
  103.         StringBuilder numberBuilder = new StringBuilder();
  104.         while (true) {
  105.             String string = stack.peek();
  106.             if (separateStr.equals(string)) {
  107.                 break;
  108.             }
  109.             numberBuilder.insert(0, string);
  110.             stack.pop();
  111.         }
  112.         stack.push(numberBuilder.toString());
  113.         stack.push(separateStr);
  114.         numberBuilder.delete(0, numberBuilder.length());
  115.     }

  116.     /**
  117.      * Determines whether a string is an operator.
  118.      *
  119.      * @param singleStr Character string to be judged
  120.      * @return Judgment Result
  121.      */
  122.     public static boolean isOperator(String singleStr) {
  123.         String operators = "-+×÷%";
  124.         if (operators.indexOf(singleStr) > NOT_CONTAIN) {
  125.             return true;
  126.         }
  127.         return false;
  128.     }

  129.     private static int priority(String str) {
  130.         String highOperator = "×÷%";
  131.         if (highOperator.indexOf(str) > NOT_CONTAIN) {
  132.             return HIGH_PRIORITY;
  133.         }
  134.         return LOW_PRIORITY;
  135.     }
  136. }
复制代码
xml样式文件
  • base/graphic/background_ability_main.xml
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
    3. ohos:shape="rectangle">
    4. <solid ohos:color="#E2E2E2" />
    5. </shape>
    复制代码

  • base/graphic/background_denghao.xml
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
    3. ohos:shape="rectangle">
    4. <solid ohos:color="blue" />
    5. <corners ohos:radius="180" />
    6. </shape>
    复制代码

  • base/graphic/background_keyboard.xml
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
    3. ohos:shape="rectangle">
    4. <solid ohos:color="#EEEEEE" />
    5. <corners ohos:radius="36" />
    6. </shape>
    复制代码

  • base/graphic/background_round.xml
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <shape xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:shape="oval">
    3. <solid
    4.     ohos:color="#FFFFFF"/>
    5. <stroke
    6.     ohos:width="3vp"
    7.     ohos:color="#FFFFFF"/>
    8. </shape>
    复制代码

xml布局文件
  • base/layout/ability_main.xml
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos"
    3. ohos:height="match_parent"
    4. ohos:orientation="vertical"
    5. ohos:alignment="bottom"
    6. ohos:background_element="$graphic:background_ability_main"
    7. ohos:width="match_parent">

    8. <DirectionalLayout
    9.     ohos:id="$+id:result_console"
    10.     ohos:height="match_content"
    11.     ohos:left_margin="15vp"
    12.     ohos:right_margin="15vp"
    13.     ohos:bottom_margin="50vp"
    14.     ohos:width="match_parent">

    15.     <TextField
    16.         ohos:id="$+id:input_text"
    17.         ohos:height="60vp"
    18.         ohos:width="match_parent"
    19.         ohos:text_size="48vp"
    20.         ohos:bubble_height="0"
    21.         ohos:multiple_lines="false"
    22.         ohos:text_alignment="right"/>

    23.     <Text
    24.         ohos:id="$+id:pre_result"
    25.         ohos:margin="3vp"
    26.         ohos:height="42vp"
    27.         ohos:width="match_parent"
    28.         ohos:text_size="36vp"
    29.         ohos:text_color="#555555"
    30.         ohos:scrollable="true"
    31.         ohos:text_alignment="right"/>

    32. </DirectionalLayout>

    33. <DirectionalLayout
    34.     ohos:id="$+id:calculate_keyboard"
    35.     ohos:height="match_content"
    36.     ohos:padding="8vp"
    37.     ohos:margin="8vp"
    38.     ohos:background_element="$graphic:background_keyboard"
    39.     ohos:width="match_parent">

    40.     <DirectionalLayout
    41.         ohos:height="match_content"
    42.         ohos:width="match_parent"
    43.         ohos:alignment="center"
    44.         ohos:orientation="horizontal">

    45.         <Text
    46.             ohos:id="$+id:number_cancel"
    47.             ohos:text_alignment="center"
    48.             ohos:height="70vp"
    49.             ohos:width="70vp"
    50.             ohos:text_size="30vp"
    51.             ohos:text_color="blue"
    52.             ohos:background_element="$graphic:background_round"
    53.             ohos:margin="8vp"
    54.             ohos:text="C"/>

    55.         <Text
    56.             ohos:id="$+id:divide"
    57.             ohos:text_alignment="center"
    58.             ohos:height="70vp"
    59.             ohos:width="70vp"
    60.             ohos:text_size="35vp"
    61.             ohos:text_color="blue"
    62.             ohos:background_element="$graphic:background_round"
    63.             ohos:margin="8vp"
    64.             ohos:text="÷"/>

    65.         <Text
    66.             ohos:id="$+id:multiply"
    67.             ohos:text_alignment="center"
    68.             ohos:height="70vp"
    69.             ohos:width="70vp"
    70.             ohos:text_size="35vp"
    71.             ohos:text_color="blue"
    72.             ohos:background_element="$graphic:background_round"
    73.             ohos:margin="8vp"
    74.             ohos:text="×"/>

    75.         <Image
    76.             ohos:id="$+id:delete"
    77.             ohos:text_alignment="center"
    78.             ohos:height="70vp"
    79.             ohos:width="70vp"
    80.             ohos:text_size="28vp"
    81.             ohos:background_element="$graphic:background_round"
    82.             ohos:margin="8vp"
    83.             ohos:image_src="$media:delete"/>
    84.     </DirectionalLayout>

    85.     <DirectionalLayout
    86.         ohos:height="match_content"
    87.         ohos:width="match_parent"
    88.         ohos:alignment="center"
    89.         ohos:orientation="horizontal">

    90.         <Text
    91.             ohos:id="$+id:seven"
    92.             ohos:text_alignment="center"
    93.             ohos:height="70vp"
    94.             ohos:width="70vp"
    95.             ohos:text_size="30vp"
    96.             ohos:background_element="$graphic:background_round"
    97.             ohos:margin="8vp"
    98.             ohos:text="7"/>

    99.         <Text
    100.             ohos:id="$+id:eight"
    101.             ohos:text_alignment="center"
    102.             ohos:height="70vp"
    103.             ohos:width="70vp"
    104.             ohos:text_size="30vp"
    105.             ohos:background_element="$graphic:background_round"
    106.             ohos:margin="8vp"
    107.             ohos:text="8"/>

    108.         <Text
    109.             ohos:id="$+id:nine"
    110.             ohos:text_alignment="center"
    111.             ohos:height="70vp"
    112.             ohos:width="70vp"
    113.             ohos:text_size="30vp"
    114.             ohos:background_element="$graphic:background_round"
    115.             ohos:margin="8vp"
    116.             ohos:text="9"/>

    117.         <Text
    118.             ohos:id="$+id:minus"
    119.             ohos:text_alignment="center"
    120.             ohos:height="70vp"
    121.             ohos:width="70vp"
    122.             ohos:text_color="blue"
    123.             ohos:text_size="30vp"
    124.             ohos:background_element="$graphic:background_round"
    125.             ohos:margin="8vp"
    126.             ohos:text="-"/>
    127.     </DirectionalLayout>

    128.     <DirectionalLayout
    129.         ohos:height="match_content"
    130.         ohos:width="match_parent"
    131.         ohos:alignment="center"
    132.         ohos:orientation="horizontal">

    133.         <Text
    134.             ohos:id="$+id:four"
    135.             ohos:text_alignment="center"
    136.             ohos:height="70vp"
    137.             ohos:width="70vp"
    138.             ohos:text_size="30vp"
    139.             ohos:background_element="$graphic:background_round"
    140.             ohos:margin="8vp"
    141.             ohos:text="4"/>

    142.         <Text
    143.             ohos:id="$+id:five"
    144.             ohos:text_alignment="center"
    145.             ohos:height="70vp"
    146.             ohos:width="70vp"
    147.             ohos:text_size="30vp"
    148.             ohos:background_element="$graphic:background_round"
    149.             ohos:margin="8vp"
    150.             ohos:text="5"/>

    151.         <Text
    152.             ohos:id="$+id:six"
    153.             ohos:text_alignment="center"
    154.             ohos:height="70vp"
    155.             ohos:width="70vp"
    156.             ohos:text_size="30vp"
    157.             ohos:background_element="$graphic:background_round"
    158.             ohos:margin="8vp"
    159.             ohos:text="6"/>

    160.         <Text
    161.             ohos:id="$+id:plus"
    162.             ohos:text_alignment="center"
    163.             ohos:height="70vp"
    164.             ohos:width="70vp"
    165.             ohos:text_color="blue"
    166.             ohos:text_size="30vp"
    167.             ohos:background_element="$graphic:background_round"
    168.             ohos:margin="8vp"
    169.             ohos:text="+"/>
    170.     </DirectionalLayout>

    171.     <DirectionalLayout
    172.         ohos:height="match_content"
    173.         ohos:width="match_parent"
    174.         ohos:orientation="horizontal"
    175.         ohos:alignment="center">
    176.         <DirectionalLayout
    177.             ohos:height="match_content"
    178.             ohos:width="match_content">

    179.             <DirectionalLayout
    180.                 ohos:height="match_content"
    181.                 ohos:width="match_parent"
    182.                 ohos:alignment="center"
    183.                 ohos:orientation="horizontal">

    184.                 <Text
    185.                     ohos:id="$+id:one"
    186.                     ohos:text_alignment="center"
    187.                     ohos:height="70vp"
    188.                     ohos:width="70vp"
    189.                     ohos:text_size="30vp"
    190.                     ohos:background_element="$graphic:background_round"
    191.                     ohos:margin="8vp"
    192.                     ohos:text="1"/>

    193.                 <Text
    194.                     ohos:id="$+id:two"
    195.                     ohos:text_alignment="center"
    196.                     ohos:height="70vp"
    197.                     ohos:width="70vp"
    198.                     ohos:text_size="30vp"
    199.                     ohos:background_element="$graphic:background_round"
    200.                     ohos:margin="8vp"
    201.                     ohos:text="2"/>

    202.                 <Text
    203.                     ohos:id="$+id:three"
    204.                     ohos:text_alignment="center"
    205.                     ohos:height="70vp"
    206.                     ohos:width="70vp"
    207.                     ohos:text_size="30vp"
    208.                     ohos:background_element="$graphic:background_round"
    209.                     ohos:margin="8vp"
    210.                     ohos:text="3"/>
    211.             </DirectionalLayout>

    212.             <DirectionalLayout
    213.                 ohos:height="match_content"
    214.                 ohos:width="match_parent"
    215.                 ohos:alignment="center"
    216.                 ohos:orientation="horizontal">

    217.                 <Text
    218.                     ohos:id="$+id:divide_remainder"
    219.                     ohos:text_alignment="center"
    220.                     ohos:height="70vp"
    221.                     ohos:width="70vp"
    222.                     ohos:text_size="30vp"
    223.                     ohos:background_element="$graphic:background_round"
    224.                     ohos:margin="8vp"
    225.                     ohos:text="%"/>

    226.                 <Text
    227.                     ohos:id="$+id:zero"
    228.                     ohos:text_alignment="center"
    229.                     ohos:height="70vp"
    230.                     ohos:width="70vp"
    231.                     ohos:text_size="30vp"
    232.                     ohos:background_element="$graphic:background_round"
    233.                     ohos:margin="8vp"
    234.                     ohos:text="0"/>

    235.                 <Text
    236.                     ohos:id="$+id:radix_point"
    237.                     ohos:text_alignment="center"
    238.                     ohos:height="70vp"
    239.                     ohos:width="70vp"
    240.                     ohos:text_size="30vp"
    241.                     ohos:background_element="$graphic:background_round"
    242.                     ohos:margin="8vp"
    243.                     ohos:text="."/>
    244.             </DirectionalLayout>

    245.         </DirectionalLayout>

    246.         <Text
    247.             ohos:id="$+id:equal_sign"
    248.             ohos:text_alignment="center"
    249.             ohos:height="150vp"
    250.             ohos:width="70vp"
    251.             ohos:text_size="35vp"
    252.             ohos:text_color="#FFFFFF"
    253.             ohos:background_element="$graphic:background_denghao"
    254.             ohos:margin="8vp"
    255.             ohos:text="="/>
    256.     </DirectionalLayout>

    257. </DirectionalLayout>

    258. </DirectionalLayout>
    复制代码

以上代码示例仅供参考,产品化的代码需要考虑数据校验和国际化。

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友