『牛角书』鸿蒙-计算器的实现
一,前言
经过在学校中的鸿蒙学习后,实现一个简易的鸿蒙应用,代码中还有很多不足,有待继续学习。
二,成果展示
三,开发思路
主要分为计算器的逻辑实现,页面布局。要注意的是计算器应用使用的是自定义的按键,为避免用户在输入数学表达式时,系统自动弹出软键盘,本应用在初始化时,会在入口类MainAbility禁止应用弹出软键盘。
1>禁止应用弹出软键盘
public class MainAbility extends Ability { @Override public void onStart(Intent intent) { // 禁止软键盘弹出 getWindow().setLayoutFlags(WindowManager.LayoutConfig.MARK_ALT_FOCUSABLE_IM, WindowManager.LayoutConfig.MARK_ALT_FOCUSABLE_IM); super.onStart(intent); super.setMainRoute(MainAbilitySlice.class.getName()); }}
2>算术逻辑
public static String getResultString(String exp) { Stack numStack = new Stack(); numStack.push(separateStr); // 数字用,分开,数字栈中,号 为了便于区分小数 Stack oprStack = new Stack(); String[] strings = exp.split(""); for (String singleStr : strings) { if (isOperator(singleStr)) { spiltExp(numStack, oprStack, singleStr); } else { numStack.push(singleStr); } } while (!oprStack.isEmpty()) { combineString(numStack); compute(numStack, oprStack); } numStack.pop(); String resultValue = numStack.peek(); return resultValue; } private static void spiltExp(Stack numStack, Stack oprStack, String singleStr) { // 运算符间的字符拼接成一个数字 combineString(numStack); if (!oprStack.isEmpty()) { // 先处理优先级高的运算符 while (!oprStack.isEmpty() && priority(singleStr) <= priority(oprStack.peek())) { combineString(numStack); compute(numStack, oprStack); } } oprStack.push(singleStr); } private static void compute(Stack numStack, Stack oprStack) { BigDecimal result = null; numStack.pop(); BigDecimal rightNumber = new BigDecimal(numStack.pop()); numStack.pop(); BigDecimal leftNumber = new BigDecimal(numStack.pop()); String operator = oprStack.pop(); switch (operator) { case "-": result = leftNumber.subtract(rightNumber); break; case "+": result = leftNumber.add(rightNumber); break; case "×": result = leftNumber.multiply(rightNumber); break; case "÷": result = leftNumber.divide(rightNumber, DECIMAL_DIGIT, BigDecimal.ROUND_HALF_UP); break; default: break; } numStack.push(result.stripTrailingZeros().toPlainString()); numStack.push(separateStr); } private static void combineString(Stack stack) { if (separateStr.equals(stack.peek())) { return; } StringBuilder numberBuilder = new StringBuilder(); while (true) { String string = stack.peek(); if (separateStr.equals(string)) { break; } numberBuilder.insert(0, string); stack.pop(); } stack.push(numberBuilder.toString()); stack.push(separateStr); numberBuilder.delete(0, numberBuilder.length()); }
3>页面布局