当前位置:   article > 正文

Android Studio实现简易计算器(带横竖屏,深色浅色模式,更该按钮颜色,selector,style的使用)_androidstudio 计算器代码 横屏

androidstudio 计算器代码 横屏

目录

前言

运行结果:

运行截屏(p50e)

 apk文件

源码文件

 项目结构

总览

MainActivity.java

drawable

更改图标的方法:

blackbutton.xml

bluebuttons.xml

greybutton.xml

orangebuttons.xml

whitebutton.xml

layout

布局文件

 竖屏:

横屏:

values

        colors.xml

strings.xml

styles

浅色模式

深色模式

themes.xml


前言

        本文章以及之后文章的程序版本使用Android Studio 2022.3.1 Patch 1 版本编辑,使用语言为java,最低支持API 27 Android 8.1,构建工具版本如下:

运行结果:

        先粘贴运行结果和源码文件和apk链接(实机演示,使用模拟器和华为P30和P50E均可执行)本图片为P50E运行截屏

运行截屏(p50e)

        屏幕大小不会导致布局变形,不放视频了,akp可以直接下载使用看一看

 apk文件

i道i的计算器1.0版本apk文件icon-default.png?t=N7T8https://download.csdn.net/download/weixin_58196051/88393857

源码文件

i道i的计算器1.0版本源码文件,注意Android Studio版本,(更低版本能打开,但没有虚拟目录)icon-default.png?t=N7T8https://download.csdn.net/download/weixin_58196051/88393859

 项目结构

不要在意这个文件名为什么

总览

        这是1.0版本里面的编辑模式目录,主函数东西不多,大多都是重复的绑定而已,初学还是看看布局之类的。

这里只是一个记录,具体的建议打开源码看看

AndroidManifest.xml中都是自动生成的,这里只有一个窗口,也没新加注册,我们就不看了。

MainActivity.java

        主函数,这里获取了activity_main.xml中的各种控件引用,并添加了一些监听器之类的常规操作,最后用栈做的方法,中缀表达式转后缀表达式那一套,虽然有近千行,但很多是重复的,注释多看看就没问题,稍微值得注意的就是对onSaveInstanceState方法的重写,保存了一些数据防止在旋转时遗失,然后再在onCreate中读取出来。

  1. package com.example.calculatorddaa;
  2. import android.content.pm.ActivityInfo;
  3. import android.content.res.Configuration;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9. import android.widget.HorizontalScrollView;
  10. import android.widget.TextView;
  11. import androidx.annotation.NonNull;
  12. import androidx.appcompat.app.AppCompatActivity;
  13. import java.text.NumberFormat;
  14. import java.util.ArrayList;
  15. import java.util.Stack;
  16. public class MainActivity extends AppCompatActivity {
  17. //变量定义
  18. EditText editText; //输入框:用于输入数字
  19. TextView textView, textView_Now, textView_M; //文本框:显示计算过程,第二个显示当前结果,第三个个显示是否存在记忆。
  20. HorizontalScrollView horizonLayout_Last, horizonLayout_Now;
  21. Button button_rotate; // 按钮,旋转
  22. Button[] number_buttons = new Button[10]; // 按钮:十个数字
  23. Button button_add, button_sub, button_mul, button_div; // 按钮:加减乘除
  24. Button button_point, button_equal_To, button_C, button_CE; // 按钮:小数点,等号,清空,退格
  25. Button button_MR, button_Mup, button_Mdown, button_MC; // 按钮:读取记忆,记忆加,记忆减,记忆删除
  26. //下面是横屏按钮
  27. Button button_left_parenthesis, button_right_parenthesis;// 两个括号
  28. Button button_e, button_pi;//两个特殊变量
  29. Button button_reciprocal, button_square, button_cubic_power, button_n_power;// 倒数,二次方,三次方,n次方,
  30. Button button_square_root, button_cube_root, button_n_root;// 平方根,立方根,n次根
  31. Button button_inv;// 切换一元运算符的按钮(反函数)
  32. Button button_ln, button_log;//ln,log
  33. Button button_sin, button_cos, button_tan;// 三角函数们
  34. String str_t_digit = "", str_t_equation = "", str_t_Now = ""; // 临时字符串,临时保存输入的数字和表达式和上次结果信息
  35. Double digit_t = 0.0; // 临时变量
  36. Integer parenthesis_n = 0; //未匹配的左括号数目,包含(,^(,三角函数(,ln(,log(
  37. Boolean mark_inv = true;// 标记变量,标记inv的状态 true正,false反
  38. ArrayList<Double> input_Double = new ArrayList<>(); // 储存用户输入的数字,用可变数组储存
  39. ArrayList<String> input_String = new ArrayList<>(); // 储存用户输入的运算符,用可变数组储存
  40. ArrayList<Boolean> input_Boolean = new ArrayList<>(); // 储存用户输入是否是数字,用可变数组储存,
  41. //直接入栈的字符串
  42. ArrayList<String> special_symbols = new ArrayList<String>();
  43. Double memory = 0.0; //记忆
  44. NumberFormat nf = NumberFormat.getInstance();//Double转String
  45. private final View.OnClickListener land_switch_onClickListener = new View.OnClickListener() {//横竖屏切换侦听器
  46. @Override
  47. public void onClick(View view) {//点击事件
  48. try {
  49. // 获取当前屏幕的方向
  50. int currentOrientation = getResources().getConfiguration().orientation;
  51. // 根据当前屏幕方向切换屏幕方向
  52. if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
  53. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  54. } else {
  55. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  56. }
  57. } catch (Exception e) {
  58. Log.e("land_switch", "error");
  59. }
  60. }
  61. };
  62. private final View.OnClickListener digit_onClickListener = new View.OnClickListener() {//数字侦听器,数字+小数点
  63. @Override
  64. public void onClick(View view) {//点击事件
  65. Button button = (Button) view; //把点击获得的id信息传递给button
  66. try {
  67. if (!str_t_equation.equals("") && str_t_equation.charAt(str_t_equation.length() - 1) == ')') {//前面是)不让输入数字
  68. return;
  69. } else if (button.getId() == R.id.button_0) {//如果点击了按钮:“0”
  70. if (!(str_t_digit.equals("0"))) { //之前不是只有一个0,才添0,防止000这样情况出现
  71. str_t_digit = str_t_digit + 0;
  72. }
  73. } else if (button.getId() == R.id.button_point) {
  74. if (str_t_digit.contains(".")) { //判断字符串中是否已包含小数点,如果有,就什么也不做
  75. return;
  76. } else { //如果没有小数点
  77. if (str_t_digit.equals("")) {//如果初时显示为空,就替换为"0."
  78. str_t_digit = "0.";
  79. } else {
  80. str_t_digit = str_t_digit + ".";
  81. }
  82. }
  83. } else { // 现在如果只有一个0,就删除0,
  84. if (str_t_digit.equals("0")) {
  85. str_t_digit = "";
  86. }//接下来是1~9的按钮
  87. if (button.getId() == R.id.button_1) {//如果点击了按钮:“1”
  88. str_t_digit = str_t_digit + 1;//变量末尾,添加一个“1”
  89. } else if (button.getId() == R.id.button_2) {//以此类推到9
  90. str_t_digit = str_t_digit + 2;
  91. } else if (button.getId() == R.id.button_3) {
  92. str_t_digit = str_t_digit + 3;
  93. } else if (button.getId() == R.id.button_4) {
  94. str_t_digit = str_t_digit + 4;
  95. } else if (button.getId() == R.id.button_5) {
  96. str_t_digit = str_t_digit + 5;
  97. } else if (button.getId() == R.id.button_6) {
  98. str_t_digit = str_t_digit + 6;
  99. } else if (button.getId() == R.id.button_7) {
  100. str_t_digit = str_t_digit + 7;
  101. } else if (button.getId() == R.id.button_8) {
  102. str_t_digit = str_t_digit + 8;
  103. } else if (button.getId() == R.id.button_9) {
  104. str_t_digit = str_t_digit + 9;
  105. } else {
  106. Log.e("digit", "error");
  107. return;
  108. }
  109. }
  110. editText.setText(str_t_digit);
  111. editText.setSelection(editText.getText().length());
  112. } catch (Exception e) {
  113. Log.e("digit", "error");
  114. }
  115. }
  116. };
  117. private final View.OnClickListener operator_onClickListener = new View.OnClickListener() {//常用运算符侦听器,
  118. @Override
  119. public void onClick(View view) {//点击事件
  120. Button button = (Button) view; //把点击获得的id信息传递给button
  121. try {
  122. //+,-,*,÷逻辑一样,除零之类的运算时再判断
  123. if (!str_t_digit.equals("")) {//有数字
  124. digit_t = Double.parseDouble(str_t_digit);// 字符串转数字
  125. input_Double.add(digit_t);// 入列
  126. //数字添加进表达式字符串
  127. str_t_equation += str_t_digit;
  128. str_t_digit = ""; //删除之前的数字字符串
  129. input_Boolean.add(true);// 入列了一个数字
  130. // 根据按钮入列运算符------------------------------
  131. } else {// 如果输入数字为空,多种情况,
  132. // 前面什么都没有,但是textView_Now不空
  133. if (str_t_equation.equals("") && !str_t_Now.equals("") && !str_t_Now.equals("错误")) {
  134. //将textView_Now内容当数字进来
  135. digit_t = Double.parseDouble(str_t_Now);// 字符串转数字
  136. input_Double.add(digit_t);// 入列
  137. //数字添加进表达式字符串
  138. str_t_equation += str_t_Now;
  139. input_Boolean.add(true);// 入列了一个数字
  140. } else if (str_t_equation.equals("") || str_t_equation.charAt(str_t_equation.length() - 1) == '(') {
  141. //前面什么都没有,或者是包含(的运算符(包含^(,三角函数,ln(,log(
  142. if (button.getId() == R.id.button_sub) {//是减号正常加入
  143. input_Double.add(0.0);// 入列了一个数字
  144. str_t_equation += "0"; // 运算符添加进表达式字符串
  145. input_Boolean.add(true);// 入列了一个数字
  146. input_String.add("-"); // 入列运算符
  147. input_Boolean.add(false);// 入列了一个运算符
  148. str_t_equation += "-"; // 运算符添加进表达式字符串
  149. editText.setText(str_t_digit);
  150. editText.setSelection(editText.getText().length());
  151. textView.setText(str_t_equation);
  152. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  153. return;
  154. } else {// 其他符号不理睬
  155. Log.e("operator", "Blank in front");
  156. return;
  157. }
  158. } else {//不是空,不是(,那就是运算符或者数字了
  159. if ("+-*/".contains(String.valueOf(str_t_equation.charAt(str_t_equation.length() - 1)))) {//前面是+-*/之一
  160. input_String.remove(input_String.size() - 1); // 删除这个运算符
  161. input_Boolean.remove(input_Boolean.size() - 1);
  162. str_t_equation = str_t_equation.substring(0, str_t_equation.length() - 1); //表达式中删除这个运算符
  163. //根据运算符添加---------------------
  164. }
  165. // 是)和数字
  166. // 根据按钮入列运算符------------------------------
  167. }
  168. }
  169. if (button.getId() == R.id.button_add) {
  170. input_String.add("+"); // 入列运算符
  171. str_t_equation += "+"; // 运算符添加进表达式字符串
  172. } else if (button.getId() == R.id.button_sub) {
  173. input_String.add("-"); // 入列运算符
  174. str_t_equation += "-"; // 运算符添加进表达式字符串
  175. } else if (button.getId() == R.id.button_mul) {
  176. input_String.add("*"); // 入列运算符
  177. str_t_equation += "*"; // 运算符添加进表达式字符串
  178. } else if (button.getId() == R.id.button_div) {
  179. input_String.add("/"); // 入列运算符
  180. str_t_equation += "/"; // 运算符添加进表达式字符串
  181. } else {
  182. Log.e("operator", "error");
  183. return;
  184. }
  185. input_Boolean.add(false);// 入列了一个运算符
  186. editText.setText(str_t_digit);
  187. editText.setSelection(editText.getText().length());
  188. textView.setText(str_t_equation);
  189. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  190. } catch (Exception e) {
  191. Log.e("operator", "error");
  192. }
  193. }
  194. };
  195. private final View.OnClickListener memory_onClickListener = new View.OnClickListener() {//四个记忆功能和e,pi这两个特殊变量
  196. @Override
  197. public void onClick(View view) {//点击事件
  198. Button button = (Button) view; //把点击获得的id信息传递给button
  199. try {
  200. if (button.getId() == R.id.button_MC) {
  201. memory = 0.0;// 清空记忆
  202. textView_M.setText("");// 隐藏M标志
  203. } else if (!str_t_equation.equals("") && str_t_equation.charAt(str_t_equation.length() - 1) == ')') {//前面是)不让输入数字,也不让MR,e,pi
  204. //既然不让输入数字,就更不会出现M+,M-,但MC还能用
  205. return;
  206. } else if (button.getId() == R.id.button_MR) {
  207. if (!textView_M.getText().equals("")) {// 不是空
  208. str_t_digit = nf.format(memory); //替换
  209. }
  210. } else if (button.getId() == R.id.button_Mup) {
  211. if (!str_t_digit.equals("")) {
  212. memory += Double.parseDouble(str_t_digit);
  213. if (memory != 0.0) {// 是空
  214. textView_M.setText("M");// 显示M标志
  215. } else {
  216. textView_M.setText("");
  217. }
  218. }
  219. } else if (button.getId() == R.id.button_Mdown) {
  220. if (!str_t_digit.equals("")) {
  221. memory -= Double.parseDouble(str_t_digit);
  222. if (memory != 0.0) {// 是空
  223. textView_M.setText("M");// 显示M标志
  224. } else {
  225. textView_M.setText("");
  226. }
  227. }
  228. } else if (button.getId() == R.id.button_e) {
  229. digit_t = Math.E;
  230. str_t_digit = nf.format(digit_t);
  231. ; //替换
  232. } else if (button.getId() == R.id.button_pi) {
  233. digit_t = Math.PI;
  234. str_t_digit = nf.format(digit_t);
  235. ; //替换
  236. } else {
  237. Log.e("memory", "error");
  238. return;
  239. }
  240. editText.setText(str_t_digit);
  241. editText.setSelection(editText.getText().length());
  242. } catch (Exception e) {
  243. Log.e("memory", "error");
  244. }
  245. }
  246. };
  247. private final View.OnClickListener parenthesis_onClickListener = new View.OnClickListener() {//括号侦听器,
  248. @Override
  249. public void onClick(View view) {//点击事件
  250. Button button = (Button) view; //把点击获得的id信息传递给button
  251. try {
  252. if (button.getId() == R.id.button_left_parenthesis) {
  253. //左括号可以出现在非数字的右边,前面什么都没有也行,如果是数字或者),前面添加一个乘号
  254. if (!input_Boolean.isEmpty() && (input_Boolean.get(input_Boolean.size() - 1) || str_t_equation.charAt(str_t_equation.length() - 1) == ')')) {// 前面有东西,且是数字或者)
  255. input_String.add("*"); // 入列运算符
  256. input_Boolean.add(false);// 入列了一个运算符
  257. str_t_equation += "*"; // 运算符添加进表达式字符串
  258. }
  259. input_String.add("("); // 入列运算符
  260. parenthesis_n += 1;
  261. input_Boolean.add(false);// 入列了一个运算符
  262. str_t_equation += "("; // 运算符添加进表达式字符串
  263. textView.setText(str_t_equation);
  264. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  265. } else if (button.getId() == R.id.button_right_parenthesis) {
  266. //右括号可以出现在数字的右边,和右括号右边,如果没有右括号且当前没有输入数字,什么也不做
  267. if (parenthesis_n > 0) {//前面有左括号才能加右括号,
  268. if (!str_t_digit.equals("")) {//有数字
  269. digit_t = Double.parseDouble(str_t_digit);// 字符串转数字
  270. input_Double.add(digit_t);// 入列
  271. //数字添加进表达式字符串
  272. str_t_equation += str_t_digit;
  273. str_t_digit = ""; //删除之前的数字字符串
  274. input_Boolean.add(true);// 入列了一个数字
  275. editText.setText(str_t_digit);
  276. editText.setSelection(editText.getText().length());
  277. } else if (str_t_equation.charAt(str_t_equation.length() - 1) != ')') {
  278. return;//没括号就润
  279. }
  280. input_String.add(")"); // 入列运算符
  281. parenthesis_n -= 1;
  282. input_Boolean.add(false);// 入列了一个运算符
  283. str_t_equation += ")"; // 运算符添加进表达式字符串
  284. textView.setText(str_t_equation);
  285. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  286. }
  287. } else {
  288. Log.e("parenthesis", "error");
  289. }
  290. } catch (Exception e) {
  291. Log.e("parenthesis", "error");
  292. }
  293. }
  294. };
  295. private final View.OnClickListener index_onClickListener = new View.OnClickListener() {//指数的侦听器,
  296. @Override
  297. public void onClick(View view) {//点击事件
  298. Button button = (Button) view; //把点击获得的id信息传递给button
  299. try {// 指数和常用运算符逻辑相似,
  300. if (!str_t_digit.equals("")) {//有数字
  301. digit_t = Double.parseDouble(str_t_digit);// 字符串转数字
  302. input_Double.add(digit_t);// 入列
  303. //数字添加进表达式字符串
  304. str_t_equation += str_t_digit;
  305. str_t_digit = ""; //删除之前的数字字符串
  306. input_Boolean.add(true);// 入列了一个数字
  307. // 根据按钮入列运算符------------------------------
  308. } else {// 如果输入数字为空,多种情况,
  309. //前面是+-*/就替换,是)和数字直接加上去,(和""不管
  310. // 前面什么都没有,但是textView_Now不空
  311. if (str_t_equation.equals("") && !str_t_Now.equals("") && !str_t_Now.equals("错误")) {
  312. //将textView_Now内容当数字进来
  313. digit_t = Double.parseDouble(str_t_Now);// 字符串转数字
  314. input_Double.add(digit_t);// 入列
  315. //数字添加进表达式字符串
  316. str_t_equation += str_t_Now;
  317. input_Boolean.add(true);// 入列了一个数字
  318. } else if (str_t_equation.equals("") || str_t_equation.charAt(str_t_equation.length() - 1) == '(') {
  319. return;
  320. } else {
  321. if ("+-*/".contains(String.valueOf(str_t_equation.charAt(str_t_equation.length() - 1)))) {//前面是+-*/之一
  322. input_String.remove(input_String.size() - 1); // 删除这个运算符
  323. input_Boolean.remove(input_Boolean.size() - 1);
  324. str_t_equation = str_t_equation.substring(0, str_t_equation.length() - 1); //表达式中删除这个运算符
  325. //根据运算符添加---------------------
  326. }
  327. // 是)和数字
  328. // 根据按钮入列运算符------------------------------
  329. }
  330. }
  331. //先添加^(,再根据里面内容加入其他东西
  332. input_String.add("^"); // 入列运算符
  333. input_Boolean.add(false);// 入列了一个运算符
  334. str_t_equation += "^"; // 运算符添加进表达式字符串
  335. input_String.add("("); // 入列运算符
  336. input_Boolean.add(false);// 入列了一个运算符
  337. str_t_equation += "("; // 运算符添加进表达式字符串
  338. parenthesis_n += 1;
  339. if (button.getId() == R.id.button_reciprocal) {
  340. input_Double.add(0.0);// 入列了一个数字
  341. str_t_equation += "0"; // 运算符添加进表达式字符串
  342. input_Boolean.add(true);// 入列了一个数字
  343. input_String.add("-"); // 入列运算符
  344. input_Boolean.add(false);// 入列了一个运算符
  345. str_t_equation += "-"; // 运算符添加进表达式字符串
  346. input_Double.add(1.0);// 入列了一个数字
  347. str_t_equation += "1"; // 运算符添加进表达式字符串
  348. input_Boolean.add(true);// 入列了一个数字
  349. input_String.add(")"); // 入列运算符
  350. input_Boolean.add(false);// 入列了一个运算符
  351. str_t_equation += ")"; // 运算符添加进表达式字符串
  352. parenthesis_n -= 1;
  353. } else if (button.getId() == R.id.button_square) {
  354. input_Double.add(2.0);// 入列了一个数字
  355. str_t_equation += "2"; // 运算符添加进表达式字符串
  356. input_Boolean.add(true);// 入列了一个数字
  357. input_String.add(")"); // 入列运算符
  358. input_Boolean.add(false);// 入列了一个运算符
  359. str_t_equation += ")"; // 运算符添加进表达式字符串
  360. parenthesis_n -= 1;
  361. } else if (button.getId() == R.id.button_cubic_power) {
  362. input_Double.add(3.0);// 入列了一个数字
  363. str_t_equation += "3"; // 运算符添加进表达式字符串
  364. input_Boolean.add(true);// 入列了一个数字
  365. input_String.add(")"); // 入列运算符
  366. input_Boolean.add(false);// 入列了一个运算符
  367. str_t_equation += ")"; // 运算符添加进表达式字符串
  368. parenthesis_n -= 1;
  369. } else if (button.getId() == R.id.button_n_power) {
  370. //n次自己输入
  371. } else if (button.getId() == R.id.button_square_root) {
  372. input_Double.add(1.0);// 入列了一个数字
  373. str_t_equation += "1"; // 运算符添加进表达式字符串
  374. input_Boolean.add(true);// 入列了一个数字
  375. input_String.add("/"); // 入列运算符
  376. input_Boolean.add(false);// 入列了一个运算符
  377. str_t_equation += "/"; // 运算符添加进表达式字符串
  378. input_Double.add(2.0);// 入列了一个数字
  379. str_t_equation += "2"; // 运算符添加进表达式字符串
  380. input_Boolean.add(true);// 入列了一个数字
  381. input_String.add(")"); // 入列运算符
  382. input_Boolean.add(false);// 入列了一个运算符
  383. str_t_equation += ")"; // 运算符添加进表达式字符串
  384. parenthesis_n -= 1;
  385. } else if (button.getId() == R.id.button_cube_root) {
  386. input_Double.add(1.0);// 入列了一个数字
  387. str_t_equation += "1"; // 运算符添加进表达式字符串
  388. input_Boolean.add(true);// 入列了一个数字
  389. input_String.add("/"); // 入列运算符
  390. input_Boolean.add(false);// 入列了一个运算符
  391. str_t_equation += "/"; // 运算符添加进表达式字符串
  392. input_Double.add(3.0);// 入列了一个数字
  393. str_t_equation += "3"; // 运算符添加进表达式字符串
  394. input_Boolean.add(true);// 入列了一个数字
  395. input_String.add(")"); // 入列运算符
  396. input_Boolean.add(false);// 入列了一个运算符
  397. str_t_equation += ")"; // 运算符添加进表达式字符串
  398. parenthesis_n -= 1;
  399. } else if (button.getId() == R.id.button_n_root) {
  400. input_Double.add(1.0);// 入列了一个数字
  401. str_t_equation += "1"; // 运算符添加进表达式字符串
  402. input_Boolean.add(true);// 入列了一个数字
  403. input_String.add("/"); // 入列运算符
  404. input_Boolean.add(false);// 入列了一个运算符
  405. str_t_equation += "/"; // 运算符添加进表达式字符串
  406. } else {
  407. Log.e("index", "error");
  408. return;
  409. }
  410. editText.setText(str_t_digit);
  411. editText.setSelection(editText.getText().length());
  412. textView.setText(str_t_equation);
  413. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  414. } catch (Exception e) {
  415. Log.e("index_onClickListener", "error");
  416. }
  417. }
  418. };
  419. private final View.OnClickListener unary_operator_onClickListener = new View.OnClickListener() {//一元运算符,包含ln,log三角函数,inv
  420. @Override
  421. public void onClick(View view) {//点击事件
  422. Button button = (Button) view; //把点击获得的id信息传递给button
  423. try {//先整inv,//单目运算符逻辑和左括号相似(毕竟包含左括号)
  424. if (button.getId() == R.id.button_inv) {
  425. mark_inv = !mark_inv;
  426. if (mark_inv) {
  427. button_sin.setText(R.string.sin);
  428. button_cos.setText(R.string.cos);
  429. button_tan.setText(R.string.tan);
  430. } else {
  431. button_sin.setText(R.string.sin_);
  432. button_cos.setText(R.string.cos_);
  433. button_tan.setText(R.string.tan_);
  434. }
  435. } else {//可以出现在非数字的右边,前面什么都没有也行,如果是数字或者),前面添加一个乘号
  436. if (!input_Boolean.isEmpty() && (input_Boolean.get(input_Boolean.size() - 1) || str_t_equation.charAt(str_t_equation.length() - 1) == ')')) {// 前面有东西,且是数字或者)
  437. input_String.add("*"); // 入列运算符
  438. input_Boolean.add(false);// 入列了一个运算符
  439. str_t_equation += "*"; // 运算符添加进表达式字符串
  440. }
  441. if (button.getId() == R.id.button_ln) {
  442. input_String.add("ln"); // 入列运算符
  443. str_t_equation += "ln"; // 运算符添加进表达式字符串
  444. } else if (button.getId() == R.id.button_log) {
  445. input_String.add("log"); // 入列运算符
  446. str_t_equation += "log"; // 运算符添加进表达式字符串
  447. } else if (button.getId() == R.id.button_sin) {
  448. if (mark_inv) {
  449. input_String.add("sin"); // 入列运算符
  450. str_t_equation += "sin"; // 运算符添加进表达式字符串
  451. } else {
  452. input_String.add("sin⁻¹"); // 入列运算符
  453. str_t_equation += "sin⁻¹"; // 运算符添加进表达式字符串
  454. }
  455. } else if (button.getId() == R.id.button_cos) {
  456. if (mark_inv) {
  457. input_String.add("cos"); // 入列运算符
  458. str_t_equation += "cos"; // 运算符添加进表达式字符串
  459. } else {
  460. input_String.add("cos⁻¹"); // 入列运算符
  461. str_t_equation += "cos⁻¹"; // 运算符添加进表达式字符串
  462. }
  463. } else if (button.getId() == R.id.button_tan) {
  464. if (mark_inv) {
  465. input_String.add("tan"); // 入列运算符
  466. str_t_equation += "tan"; // 运算符添加进表达式字符串
  467. } else {
  468. input_String.add("tan⁻¹"); // 入列运算符
  469. str_t_equation += "tan⁻¹"; // 运算符添加进表达式字符串
  470. }
  471. } else {
  472. Log.e("unary_operator", "error");
  473. return;
  474. }
  475. input_Boolean.add(false);// 入列了一个运算符
  476. //都要进来一个(
  477. input_String.add("("); // 入列运算符
  478. parenthesis_n += 1;
  479. input_Boolean.add(false);// 入列了一个运算符
  480. str_t_equation += "("; // 运算符添加进表达式字符串
  481. textView.setText(str_t_equation);
  482. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  483. }
  484. } catch (Exception e) {
  485. Log.e("unary_operator", "error");
  486. }
  487. }
  488. };
  489. private final View.OnClickListener delete_onClickListener = new View.OnClickListener() {//退位和清空侦听器,
  490. @Override
  491. public void onClick(View view) {//点击事件
  492. Button button = (Button) view; //把点击获得的id信息传递给button
  493. try {
  494. if (button.getId() == R.id.button_C) { // 清空,第一次删除数字,然后算式,最后上次结果
  495. if (!str_t_digit.equals("")) { // 有数字
  496. str_t_digit = "";//清空数字
  497. } else if (!str_t_equation.equals("")) { //有表达式
  498. str_t_equation = "";// 清空表达式
  499. parenthesis_n = 0;
  500. input_String.clear();
  501. input_Double.clear();
  502. input_Boolean.clear();
  503. } else {
  504. str_t_Now = "";// 清空上次结果
  505. }
  506. editText.setText(str_t_digit);
  507. editText.setSelection(editText.getText().length());
  508. textView.setText(str_t_equation);
  509. textView_Now.setText(str_t_Now);
  510. } else if (button.getId() == R.id.button_CE) { // 单纯的数字退格改为没数字退格表达式
  511. if (!str_t_digit.equals("")) { // 有数字
  512. str_t_digit = str_t_digit.substring(0, str_t_digit.length() - 1);
  513. editText.setText(str_t_digit);
  514. editText.setSelection(editText.getText().length());
  515. } else { // 退位表达式,出栈,注意特殊运算符的处理,括号的处理
  516. if (!input_Boolean.isEmpty()) { // 表达式有东西才处理
  517. if (input_Boolean.get(input_Boolean.size() - 1)) { // 最右边是数字,按目前设定不太可能出现这种情况
  518. Log.e("delete", "需要弹出字符串。");
  519. } else {
  520. String pop_string = input_String.get(input_String.size() - 1); // 记录删除的运算符
  521. input_String.remove(input_String.size() - 1);
  522. input_Boolean.remove(input_Boolean.size() - 1);
  523. str_t_equation = str_t_equation.substring(0, str_t_equation.lastIndexOf(pop_string)); // 字符串删除运算符
  524. //(),常用运算符,特殊运算符
  525. if (pop_string.equals("(")) { //出来的是左括号,判断是左边否为特殊运算符
  526. parenthesis_n -= 1; //减少未匹配括号
  527. if (!input_Boolean.isEmpty() && !input_Boolean.get(input_Boolean.size() - 1)) {
  528. //前面有东西,并且是运算符,
  529. if (special_symbols.contains(input_String.get(input_String.size() - 1))) {
  530. //而且这个运算符还是特殊运算符
  531. //删除这个特殊运算符
  532. str_t_equation = str_t_equation.substring(0, str_t_equation.lastIndexOf(input_String.get(input_String.size() - 1))); // 字符串删除特殊运算符
  533. input_String.remove(input_String.size() - 1);
  534. input_Boolean.remove(input_Boolean.size() - 1);
  535. }
  536. //左边还有可能是^(,的形式,也一起删了
  537. else if (input_String.get(input_String.size() - 1).equals("^")) {
  538. str_t_equation = str_t_equation.substring(0, str_t_equation.lastIndexOf(input_String.get(input_String.size() - 1))); // 字符串删除^
  539. input_String.remove(input_String.size() - 1);
  540. input_Boolean.remove(input_Boolean.size() - 1);
  541. //如果左边是数字一并删除数字
  542. if (!input_Boolean.isEmpty() && input_Boolean.get(input_Boolean.size() - 1)) {
  543. input_Double.remove(input_Double.size() - 1);
  544. input_Boolean.remove(input_Boolean.size() - 1);
  545. if (!input_String.isEmpty()) {
  546. str_t_equation = str_t_equation.substring(0, str_t_equation.lastIndexOf(input_String.get(input_String.size() - 1)) + input_String.get(input_String.size() - 1).length()); // 字符串删除数字
  547. } else { // 前面没东西了
  548. str_t_equation = ""; //清空
  549. }
  550. }
  551. }
  552. // +(,-(等不用在意
  553. }
  554. } else { // 那就是+-*/)
  555. if (pop_string.equals(")")) { //出来的是右括号,未匹配括号+1
  556. parenthesis_n += 1; //增加未匹配括号
  557. }
  558. //如果左边是数字一并删除数字
  559. if (!input_Boolean.isEmpty() && input_Boolean.get(input_Boolean.size() - 1)) {
  560. input_Double.remove(input_Double.size() - 1);
  561. input_Boolean.remove(input_Boolean.size() - 1);
  562. if (!input_String.isEmpty()) {
  563. str_t_equation = str_t_equation.substring(0, str_t_equation.lastIndexOf(input_String.get(input_String.size() - 1)) + input_String.get(input_String.size() - 1).length()); // 字符串删除数字
  564. } else { // 前面没东西了
  565. str_t_equation = ""; //清空
  566. }
  567. }
  568. }
  569. textView.setText(str_t_equation);
  570. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  571. }
  572. }
  573. }
  574. } else {
  575. Log.e("delete", "error");
  576. }
  577. } catch (Exception e) {
  578. Log.e("delete", "big error");
  579. }
  580. }
  581. };
  582. private final View.OnClickListener equal_To_onClickListener = new View.OnClickListener() {//等于号侦听器
  583. @Override
  584. public void onClick(View view) {//点击事件
  585. //看看算式最右边是不是除了)的运算符,是的话看看当前有没有数字,有的话加进表达式中
  586. if (!input_Boolean.isEmpty()) {
  587. if (!input_Boolean.get(input_Boolean.size() - 1) && str_t_equation.charAt(str_t_equation.length() - 1) != ')') {
  588. //最右边是非)的运算符
  589. if (!str_t_digit.equals("")) {//有数字
  590. digit_t = Double.parseDouble(str_t_digit);// 字符串转数字
  591. input_Double.add(digit_t);// 入列
  592. //数字添加进表达式字符串
  593. str_t_equation += str_t_digit;
  594. str_t_digit = ""; //删除之前的数字字符串
  595. input_Boolean.add(true);// 入列了一个数字
  596. } else {//没数字就补个0吧
  597. digit_t = 0.0;// 字符串转数字
  598. input_Double.add(digit_t);// 入列
  599. //数字添加进表达式字符串
  600. str_t_equation += "0";
  601. input_Boolean.add(true);// 入列了一个数字
  602. }
  603. }
  604. if (parenthesis_n > 0) {// 看看当前有没有没写的),有的话加进表达式中,
  605. while (parenthesis_n > 0) {
  606. input_String.add(")"); // 入列运算符
  607. parenthesis_n -= 1;
  608. input_Boolean.add(false);// 入列了一个运算符
  609. str_t_equation += ")"; // 运算符添加进表达式字符串
  610. }
  611. }
  612. editText.setText(str_t_digit);
  613. editText.setSelection(editText.getText().length());
  614. textView.setText(str_t_equation);
  615. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  616. str_t_Now = count_String();//计算算式
  617. } else {//表达式什么都没有
  618. //直接结果0
  619. str_t_Now = "0";
  620. }
  621. textView_Now.setText(str_t_Now);
  622. editText.setText(str_t_digit);
  623. editText.setSelection(editText.getText().length());
  624. textView.setText(str_t_equation);
  625. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  626. //清空表达式
  627. input_String.clear();
  628. input_Double.clear();
  629. input_Boolean.clear();
  630. str_t_equation = "";
  631. //暂时不需要重新显示,让用户看一会
  632. }
  633. public String count_String() {
  634. // 对输入的字符串进行计算,如果有错误,返回”错误“,没有返回计算结果
  635. try {//用栈计算
  636. Stack<Double> numStack = new Stack<>();//数字栈
  637. Stack<String> symbolStack = new Stack<>();//符号栈
  638. String str_pop;// 出栈的运算符
  639. int priority1, priority2;
  640. Double numeral1, numeral2;
  641. // 首尾添加#
  642. input_String.add(0, "#");
  643. input_Boolean.add(0, false);
  644. input_String.add("#");
  645. input_Boolean.add(false);
  646. // 优先级是^>*=/>+=->(=)=单目>#,()和单目运算符特殊处理
  647. while (!input_Boolean.isEmpty()) {//没东西就停下
  648. if (input_Boolean.get(0)) {//数字直接入数字栈就行
  649. input_Boolean.remove(0);
  650. numStack.push(input_Double.remove(0));
  651. } else {//运算符开始看情况
  652. //(,三角函数,ln,log直接入,
  653. //按优先级来,优先级高的碰到优先级低的直接入栈,低的碰到高的就出栈计算,
  654. if (special_symbols.contains(input_String.get(0)) || "(".equals(input_String.get(0)) || symbolStack.empty()) {
  655. //是特殊字符串,或者栈为空,直接入栈
  656. input_Boolean.remove(0);
  657. symbolStack.push(input_String.remove(0));
  658. } else {
  659. priority1 = get_priority(input_String.get(0));
  660. priority2 = get_priority(symbolStack.peek());
  661. if (priority1 == -1 || priority2 == -1) {
  662. Log.e("equal_To", "数字栈不足");
  663. return "错误";
  664. }
  665. if (priority1 > priority2) {// 否则看看两者优先级
  666. // 如果外面的优先级大,就入栈
  667. input_Boolean.remove(0);
  668. symbolStack.push(input_String.remove(0));
  669. } else {//否则,出栈看看
  670. str_pop = symbolStack.pop();//出栈一个运算符
  671. //根据出栈的运算符,判断要做的事情
  672. if (str_pop.equals("(")) {//出来个左括号,后面只有可能是),不然有错误
  673. if (input_String.get(0).equals(")")) {//是)就出栈,并看看前面是不是单目运算符
  674. input_Boolean.remove(0);
  675. input_String.remove(0);
  676. if (special_symbols.contains(symbolStack.peek())) {//前面是特殊运算符
  677. //获得特殊运算符
  678. str_pop = symbolStack.pop();
  679. //出栈一个元素,做出运算后再入栈
  680. numeral1 = numStack.pop();
  681. switch (str_pop) {
  682. case "ln":
  683. numStack.push(Math.log(numeral1));
  684. break;
  685. case "log":
  686. numStack.push(Math.log10(numeral1));
  687. break;
  688. case "sin":
  689. numStack.push(Math.sin(numeral1));
  690. break;
  691. case "cos":
  692. numStack.push(Math.cos(numeral1));
  693. break;
  694. case "tan":
  695. numStack.push(Math.tan(numeral1));
  696. break;
  697. case "sin⁻¹":
  698. numStack.push(Math.asin(numeral1));
  699. break;
  700. case "cos⁻¹":
  701. numStack.push(Math.acos(numeral1));
  702. break;
  703. case "tan⁻¹":
  704. numStack.push(Math.atan(numeral1));
  705. break;
  706. default:
  707. Log.e("equal_To", "左括号左边有其他运算符");
  708. return "错误";
  709. }
  710. }
  711. } else {
  712. Log.e("equal_To", "左括号出栈时,右边不是右括号");
  713. return "错误";
  714. }
  715. } else if (str_pop.equals("#")) {//如果出来个#
  716. input_Boolean.remove(0);// 后面只能一个#,出来吧
  717. input_String.remove(0);// 如果算式正确,循环接下来就会结束
  718. } else {//双目运算符,出来两个数
  719. numeral2 = numStack.pop();//这里就不判断栈是否空了,如果空,会进入try错误处理
  720. numeral1 = numStack.pop();
  721. switch (str_pop) {
  722. case "^":
  723. numStack.push(Math.pow(numeral1, numeral2));
  724. break;
  725. case "+":
  726. numStack.push(numeral1 + numeral2);
  727. break;
  728. case "-":
  729. numStack.push(numeral1 - numeral2);
  730. break;
  731. case "*":
  732. numStack.push(numeral1 * numeral2);
  733. break;
  734. case "/":
  735. if (numeral2 == 0) {
  736. Log.e("equal_To", "除数为0");
  737. return "错误";
  738. }
  739. numStack.push(numeral1 / numeral2);
  740. break;
  741. default:
  742. Log.e("equal_To", "非正常常用运算符");
  743. return "错误";
  744. }
  745. }
  746. }
  747. }
  748. }
  749. }
  750. //循环结束,如果此时符号栈还有东西,或者数字栈多于一个数,就报错
  751. if (!symbolStack.empty() || numStack.size() > 1) {
  752. Log.e("equal_To", "循环结束后,栈内还有东西");
  753. while (!symbolStack.empty()) {
  754. Log.e("equal_To", "符号栈内东西有:" + symbolStack.pop());
  755. }
  756. while (!numStack.empty()) {
  757. Log.e("equal_To", "数字栈内东西有:" + numStack.pop().toString());
  758. }
  759. return "错误";
  760. } else {
  761. return nf.format(numStack.pop());
  762. }
  763. } catch (Exception e) {
  764. Log.e("equal_To", "其他错误" + e.toString());
  765. return "错误";
  766. }
  767. }
  768. public int get_priority(String str) {// 返回优先级
  769. switch (str) {
  770. case "^":
  771. return 4;
  772. case "*":
  773. case "/":
  774. return 3;
  775. case "+":
  776. case "-":
  777. return 2;
  778. case "(":
  779. case ")":
  780. return 1;
  781. case "#":
  782. return 0;
  783. default:
  784. return -1;
  785. }
  786. }
  787. };
  788. // 被销毁前缓存一些数据,为了旋转后不出问题
  789. @Override
  790. protected void onSaveInstanceState(@NonNull Bundle outState) {
  791. super.onSaveInstanceState(outState);
  792. outState.putDouble("memory", memory);
  793. outState.putInt("parenthesis_n", parenthesis_n);
  794. outState.putString("str_t_digit", str_t_digit);
  795. outState.putString("str_t_equation", str_t_equation);
  796. outState.putString("str_t_Now", str_t_Now);
  797. outState.putSerializable("input_Double", input_Double);
  798. outState.putSerializable("input_String", input_String);
  799. outState.putSerializable("input_Boolean", input_Boolean);
  800. }
  801. //下面这个重写了父类的方法,会在程序启动时调用,
  802. @Override
  803. protected void onCreate(Bundle savedInstanceState) {
  804. super.onCreate(savedInstanceState); // 调用父类的onCreate()方法
  805. setContentView(R.layout.activity_main); // 布局文件的位置
  806. special_symbols.add("ln");
  807. special_symbols.add("log");
  808. special_symbols.add("sin");
  809. special_symbols.add("cos");
  810. special_symbols.add("tan");
  811. special_symbols.add("sin⁻¹");
  812. special_symbols.add("cos⁻¹");
  813. special_symbols.add("tan⁻¹");
  814. nf.setGroupingUsed(false);//不使用12,345,789这样的三位格式化
  815. nf.setMaximumFractionDigits(16);// 最大保留16位小数
  816. nf.setMinimumFractionDigits(0);// 最小保留16位小数
  817. // 获取文本框引用
  818. editText = findViewById(R.id.textView_Equation);
  819. textView = findViewById(R.id.textView_Last);
  820. textView_Now = findViewById(R.id.textView_Now);
  821. //滚动控件引用
  822. horizonLayout_Last = findViewById(R.id.horizonLayout_Last);
  823. horizonLayout_Now = findViewById(R.id.horizonLayout_Now);
  824. //文本框赋值会自动移动光标到最左边,记着移回最右边
  825. // 上面带滚动条的把滚动条移到最右边
  826. // 禁止弹出文本框,并且不允许长按,以防粘贴进奇奇怪怪的东西
  827. editText.setShowSoftInputOnFocus(false);
  828. editText.setLongClickable(false);
  829. if (savedInstanceState != null) {
  830. // 从保存的 Bundle 中恢复数据
  831. memory = savedInstanceState.getDouble("memory");
  832. parenthesis_n = savedInstanceState.getInt("parenthesis_n");
  833. str_t_digit = savedInstanceState.getString("str_t_digit");
  834. str_t_equation = savedInstanceState.getString("str_t_equation");
  835. str_t_Now = savedInstanceState.getString("str_t_Now");
  836. input_Double = (ArrayList<Double>) savedInstanceState.getSerializable("input_Double");
  837. input_String = (ArrayList<String>) savedInstanceState.getSerializable("input_String");
  838. input_Boolean = (ArrayList<Boolean>) savedInstanceState.getSerializable("input_Boolean");
  839. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  840. }
  841. textView.setText(str_t_equation);
  842. horizonLayout_Last.fullScroll(View.FOCUS_RIGHT);// 滑动到最右边
  843. textView_Now.setText(str_t_Now);
  844. editText.setText(str_t_digit);
  845. // 光标移动
  846. editText.setSelection(editText.getText().length());
  847. // 获取按钮引用
  848. //旋转
  849. button_rotate = findViewById(R.id.button_rotate);
  850. // 数字
  851. number_buttons[0] = findViewById(R.id.button_0);
  852. number_buttons[1] = findViewById(R.id.button_1);
  853. number_buttons[2] = findViewById(R.id.button_2);
  854. number_buttons[3] = findViewById(R.id.button_3);
  855. number_buttons[4] = findViewById(R.id.button_4);
  856. number_buttons[5] = findViewById(R.id.button_5);
  857. number_buttons[6] = findViewById(R.id.button_6);
  858. number_buttons[7] = findViewById(R.id.button_7);
  859. number_buttons[8] = findViewById(R.id.button_8);
  860. number_buttons[9] = findViewById(R.id.button_9);
  861. // 小数点
  862. button_point = findViewById(R.id.button_point);
  863. // 常用运算符
  864. button_add = findViewById(R.id.button_add);
  865. button_sub = findViewById(R.id.button_sub);
  866. button_mul = findViewById(R.id.button_mul);
  867. button_div = findViewById(R.id.button_div);
  868. // 等于号
  869. button_equal_To = findViewById(R.id.button_equal_To);
  870. // 两个删除
  871. button_C = findViewById(R.id.button_C);
  872. button_CE = findViewById(R.id.button_CE);
  873. // 记忆变量相关
  874. textView_M = findViewById(R.id.textView_M);
  875. if (memory == 0.0) {
  876. textView_M.setText("");
  877. }// 隐藏M标志
  878. button_MC = findViewById(R.id.button_MC);
  879. button_Mup = findViewById(R.id.button_Mup);
  880. button_Mdown = findViewById(R.id.button_Mdown);
  881. button_MR = findViewById(R.id.button_MR);
  882. // 横屏运算符
  883. // 两个括号
  884. button_left_parenthesis = findViewById(R.id.button_left_parenthesis);
  885. button_right_parenthesis = findViewById(R.id.button_right_parenthesis);
  886. //两个特殊变量
  887. button_e = findViewById(R.id.button_e);
  888. button_pi = findViewById(R.id.button_pi);
  889. // 倒数,二次方,三次方,n次方,
  890. button_reciprocal = findViewById(R.id.button_reciprocal);
  891. button_square = findViewById(R.id.button_square);
  892. button_cubic_power = findViewById(R.id.button_cubic_power);
  893. button_n_power = findViewById(R.id.button_n_power);
  894. // 平方根,立方根,n次根
  895. button_square_root = findViewById(R.id.button_square_root);
  896. button_cube_root = findViewById(R.id.button_cube_root);
  897. button_n_root = findViewById(R.id.button_n_root);
  898. // 切换一元运算符的按钮(反函数)
  899. button_inv = findViewById(R.id.button_inv);
  900. //ln,log
  901. button_ln = findViewById(R.id.button_ln);
  902. button_log = findViewById(R.id.button_log);
  903. // 三角函数们
  904. button_sin = findViewById(R.id.button_sin);
  905. button_cos = findViewById(R.id.button_cos);
  906. button_tan = findViewById(R.id.button_tan);
  907. // 为按钮添加监听器
  908. button_rotate.setOnClickListener(land_switch_onClickListener);
  909. button_point.setOnClickListener(digit_onClickListener);
  910. number_buttons[0].setOnClickListener(digit_onClickListener);
  911. number_buttons[1].setOnClickListener(digit_onClickListener);
  912. number_buttons[2].setOnClickListener(digit_onClickListener);
  913. number_buttons[3].setOnClickListener(digit_onClickListener);
  914. number_buttons[4].setOnClickListener(digit_onClickListener);
  915. number_buttons[5].setOnClickListener(digit_onClickListener);
  916. number_buttons[6].setOnClickListener(digit_onClickListener);
  917. number_buttons[7].setOnClickListener(digit_onClickListener);
  918. number_buttons[8].setOnClickListener(digit_onClickListener);
  919. number_buttons[9].setOnClickListener(digit_onClickListener);
  920. button_add.setOnClickListener(operator_onClickListener);
  921. button_sub.setOnClickListener(operator_onClickListener);
  922. button_mul.setOnClickListener(operator_onClickListener);
  923. button_div.setOnClickListener(operator_onClickListener);
  924. button_C.setOnClickListener(delete_onClickListener);
  925. button_CE.setOnClickListener(delete_onClickListener);
  926. button_equal_To.setOnClickListener(equal_To_onClickListener);
  927. button_MC.setOnClickListener(memory_onClickListener);
  928. button_Mup.setOnClickListener(memory_onClickListener);
  929. button_Mdown.setOnClickListener(memory_onClickListener);
  930. button_MR.setOnClickListener(memory_onClickListener);
  931. // 两个括号
  932. button_left_parenthesis.setOnClickListener(parenthesis_onClickListener);
  933. button_right_parenthesis.setOnClickListener(parenthesis_onClickListener);
  934. //两个特殊变量
  935. button_e.setOnClickListener(memory_onClickListener);
  936. button_pi.setOnClickListener(memory_onClickListener);
  937. // 倒数,二次方,三次方,n次方,
  938. button_reciprocal.setOnClickListener(index_onClickListener);
  939. button_square.setOnClickListener(index_onClickListener);
  940. button_cubic_power.setOnClickListener(index_onClickListener);
  941. button_n_power.setOnClickListener(index_onClickListener);
  942. // 平方根,立方根,n次根
  943. button_square_root.setOnClickListener(index_onClickListener);
  944. button_cube_root.setOnClickListener(index_onClickListener);
  945. button_n_root.setOnClickListener(index_onClickListener);
  946. // 切换一元运算符的按钮(反函数)
  947. button_inv.setOnClickListener(unary_operator_onClickListener);
  948. //ln,log
  949. button_ln.setOnClickListener(unary_operator_onClickListener);
  950. button_log.setOnClickListener(unary_operator_onClickListener);
  951. // 三角函数们
  952. button_sin.setOnClickListener(unary_operator_onClickListener);
  953. button_cos.setOnClickListener(unary_operator_onClickListener);
  954. button_tan.setOnClickListener(unary_operator_onClickListener);
  955. }
  956. }

drawable

        drawable中,设置的几个blackbutton之类的,以button或buttons结尾命名的文件是selector,其中是不同颜色的圆角按钮的定义,将设定好的selector用作按钮的背景就可以整出异形按钮了,这里使用的都是圆角按钮。那两个ic打头的本来是初始自带的图标但我更改了图标,所以没什么用了。

更改图标的方法:

        首先把你想整的图片粘贴进drawable目录,虽然是虚拟目录,但能直接粘贴进去。

        使用快捷键Ctrl+Shift+A,会弹出搜索框,输入im选择第一个,就是那个带安卓图标的Image Asset。

 然后把前景替换就行,第二个是背景,我直接设成白色了,图片是我自己画的,怕被拉去要钱。过一段时间整一个个人logo。

 

 具体的在网上查查Image Asset的使用之类的。设置完了就会虚拟目录就会多一个mipmap

blackbutton.xml

这几个按钮的xml都大同小异,看一个剩下的就不用看了,只是改改颜色而已,建议去看看布局。里面的@color/***都是在colors.xml中定义的,八位16进制颜色和6位16进制颜色都可以。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!--按下样式-->
  4. <item android:state_pressed="true">
  5. <shape android:shape="rectangle">
  6. <corners android:radius="50dp"><!--角大小--></corners>
  7. <solid android:color="@color/c_light_background" ><!--按钮颜色--></solid>
  8. <stroke android:width="1dp"
  9. android:color="@color/c_light_button"><!--边框大小和颜色--></stroke>
  10. </shape>
  11. </item>
  12. <!--平常样式-->
  13. <item android:state_pressed="false">
  14. <shape android:shape="rectangle"><!--长方形按钮-->
  15. <corners android:radius="50dp"><!--角大小--></corners>
  16. <solid android:color="@color/c_light_button" ><!--按钮颜色--></solid>
  17. <stroke android:width="1dp"
  18. android:color="@color/c_light_button"><!--边框大小和颜色--></stroke>
  19. </shape>
  20. </item>
  21. </selector>

bluebuttons.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!--按下样式-->
  4. <item android:state_pressed="true">
  5. <shape android:shape="rectangle">
  6. <corners android:radius="50dp"><!--角大小--></corners>
  7. <solid android:color="@color/c_blue_" ><!--按钮颜色--></solid>
  8. <stroke android:width="1dp"
  9. android:color="@color/c_dark_grey"><!--边框大小和颜色--></stroke>
  10. </shape>
  11. </item>
  12. <!--平常样式-->
  13. <item android:state_pressed="false">
  14. <shape android:shape="rectangle"><!--长方形按钮-->
  15. <corners android:radius="50dp"><!--角大小--></corners>
  16. <solid android:color="@color/c_blue" ><!--按钮颜色--></solid>
  17. <stroke android:width="1dp"
  18. android:color="@color/c_dark_grey"><!--边框大小和颜色--></stroke>
  19. </shape>
  20. </item>
  21. </selector>

greybutton.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!--按下样式-->
  4. <item android:state_pressed="true">
  5. <shape android:shape="rectangle">
  6. <corners android:radius="50dp"><!--角大小--></corners>
  7. <solid android:color="@color/c_dark_grey" ><!--按钮颜色--></solid>
  8. <stroke android:width="1dp"
  9. android:color="@color/c_dark_grey"><!--边框大小和颜色--></stroke>
  10. </shape>
  11. </item>
  12. <!--平常样式-->
  13. <item android:state_pressed="false">
  14. <shape android:shape="rectangle"><!--长方形按钮-->
  15. <corners android:radius="50dp"><!--角大小--></corners>
  16. <solid android:color="@color/c_grey" ><!--按钮颜色--></solid>
  17. <stroke android:width="1dp"
  18. android:color="@color/c_dark_grey"><!--边框大小和颜色--></stroke>
  19. </shape>
  20. </item>
  21. </selector>

orangebuttons.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!--按下样式-->
  4. <item android:state_pressed="true">
  5. <shape android:shape="rectangle">
  6. <corners android:radius="50dp"><!--角大小--></corners>
  7. <solid android:color="@color/c_orange_" ><!--按钮颜色--></solid>
  8. <stroke android:width="1dp"
  9. android:color="@color/c_dark_grey"><!--边框大小和颜色--></stroke>
  10. </shape>
  11. </item>
  12. <!--平常样式-->
  13. <item android:state_pressed="false">
  14. <shape android:shape="rectangle"><!--长方形按钮-->
  15. <corners android:radius="50dp"><!--角大小--></corners>
  16. <solid android:color="@color/c_orange" ><!--按钮颜色--></solid>
  17. <stroke android:width="1dp"
  18. android:color="@color/c_dark_grey"><!--边框大小和颜色--></stroke>
  19. </shape>
  20. </item>
  21. </selector>

whitebutton.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <!--按下样式-->
  4. <item android:state_pressed="true">
  5. <shape android:shape="rectangle">
  6. <corners android:radius="50dp"><!--角大小--></corners>
  7. <solid android:color="@color/c_grey"><!--按钮颜色--></solid>
  8. <stroke android:width="1dp" android:color="@color/c_dark_grey"><!--边框大小和颜色--></stroke>
  9. </shape>
  10. </item>
  11. <!--平常样式-->
  12. <item android:state_pressed="false">
  13. <shape android:shape="rectangle"><!--长方形按钮-->
  14. <corners android:radius="50dp"><!--角大小--></corners>
  15. <solid android:color="@color/c_white"><!--按钮颜色--></solid>
  16. <stroke android:width="1dp" android:color="@color/c_dark_grey"><!--边框大小和颜色--></stroke>
  17. </shape>
  18. </item>
  19. </selector>

layout

布局文件

布局文件,一个竖屏,一个横屏,横屏刚开始没有,你换成系统目录视图,在layout-land创建就行

 竖屏:

本来使用的网格布局,后来发现p30上显示有问题,换成约束布局了,约束布局就别敲代码了,可视化整的方便些,就是可能会有些卡。约束布局也是大同小异,稍微值得注意的就是这里使用了一些横向滚动容器来装文本控件。使用style来统一设定。

  1. <?xml version="1.0" encoding="utf-8"?><!---->
  2. <!--这是竖屏布局
  3. 最大4列,10行,长宽全占满
  4. -->
  5. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  6. xmlns:app="http://schemas.android.com/apk/res-auto"
  7. xmlns:tools="http://schemas.android.com/tools"
  8. style="@style/layoutStyle"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. tools:context=".MainActivity">
  12. <!--第0行有M标志,切换横竖屏的按钮-->
  13. <TextView
  14. android:id="@+id/textView_M"
  15. style="@style/lastTextBoxStyle"
  16. android:text="@string/M"
  17. app:layout_constraintBottom_toTopOf="@+id/horizonLayout_Last"
  18. app:layout_constraintHeight_percent="0.05"
  19. app:layout_constraintStart_toStartOf="parent"
  20. app:layout_constraintTop_toTopOf="parent"
  21. app:layout_constraintWidth_percent="0.1" />
  22. <!--占位用-->
  23. <ImageButton
  24. style="@style/lastTextBoxStyle"
  25. app:layout_constraintBottom_toTopOf="@+id/horizonLayout_Last"
  26. app:layout_constraintEnd_toStartOf="@+id/button_rotate"
  27. app:layout_constraintStart_toEndOf="@+id/textView_M"
  28. app:layout_constraintTop_toTopOf="parent" />
  29. <Button
  30. android:id="@+id/button_rotate"
  31. style="@style/lastTextBoxStyle"
  32. android:text="@string/rotate"
  33. app:layout_constraintBottom_toTopOf="@+id/horizonLayout_Last"
  34. app:layout_constraintEnd_toEndOf="parent"
  35. app:layout_constraintHeight_percent="0.05"
  36. app:layout_constraintTop_toTopOf="parent"
  37. app:layout_constraintWidth_percent="0.1" />
  38. <!--第1行是上回的结果,叫文本框——上次,
  39. 后来设计有变,改为储存表达式的文本
  40. 初始没文本,在第1行,在第0列,占4列,占1行,
  41. 为了水平滚动,加了滚动容器
  42. -->
  43. <HorizontalScrollView
  44. android:id="@+id/horizonLayout_Last"
  45. style="@style/lastTextBoxStyle"
  46. android:layout_width="match_parent"
  47. android:scrollbars="vertical"
  48. app:layout_constraintEnd_toEndOf="parent"
  49. app:layout_constraintHeight_percent="0.08"
  50. app:layout_constraintStart_toStartOf="parent"
  51. app:layout_constraintTop_toBottomOf="@+id/button_rotate"
  52. app:layout_constraintWidth_percent="1">
  53. <TextView
  54. android:id="@+id/textView_Last"
  55. style="@style/lastTextBoxStyle"
  56. android:layout_width="wrap_content"
  57. android:layout_height="match_parent"
  58. android:layout_gravity="end"
  59. android:gravity="end"
  60. android:maxLines="1"
  61. android:scrollbars="vertical"
  62. android:text=""
  63. android:textSize="24sp"
  64. app:layout_constraintEnd_toEndOf="parent"
  65. app:layout_constraintStart_toStartOf="parent" />
  66. </HorizontalScrollView>
  67. <!--第2行是算式,叫文本框——方程
  68. 初始没文本,粗体,在第2行,在第0列,占4列,占1行,
  69. gravity="end":文本靠右,只显示一行文本,不换行
  70. -->
  71. <!--当前结果
  72. 初始没文本,在第3行,在第0列,占4列,占1行,
  73. gravity="end":文本靠右-->
  74. <!--第4行 分别是MR,M+,M-,MC,四个按钮-->
  75. <EditText
  76. android:id="@+id/textView_Equation"
  77. style="@style/editTextBoxStyle"
  78. android:focusableInTouchMode="false"
  79. android:gravity="right"
  80. android:marqueeRepeatLimit="marquee_forever"
  81. android:singleLine="true"
  82. android:text=""
  83. android:textSize="50sp"
  84. app:layout_constraintEnd_toEndOf="parent"
  85. app:layout_constraintHeight_percent="0.15"
  86. app:layout_constraintHorizontal_bias="0.0"
  87. app:layout_constraintStart_toStartOf="parent"
  88. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Last"
  89. app:layout_constraintWidth_percent="1" />
  90. <HorizontalScrollView
  91. android:id="@+id/horizonLayout_Now"
  92. style="@style/lastTextBoxStyle"
  93. android:scrollbars="vertical"
  94. app:layout_constraintEnd_toEndOf="parent"
  95. app:layout_constraintHeight_percent="0.08"
  96. app:layout_constraintStart_toStartOf="parent"
  97. app:layout_constraintTop_toBottomOf="@+id/textView_Equation"
  98. app:layout_constraintWidth_percent="1">
  99. <TextView
  100. android:id="@+id/textView_Now"
  101. style="@style/lastTextBoxStyle"
  102. android:layout_width="wrap_content"
  103. android:layout_height="match_parent"
  104. android:layout_gravity="end"
  105. android:gravity="end"
  106. android:maxLines="1"
  107. android:scrollbars="vertical"
  108. android:text=""
  109. android:textSize="20sp"
  110. app:layout_constraintEnd_toEndOf="parent"
  111. app:layout_constraintStart_toStartOf="parent" />
  112. </HorizontalScrollView>
  113. <Button
  114. android:id="@+id/button_MR"
  115. style="@style/normalButtonStyle"
  116. android:text="@string/MR"
  117. android:textSize="25sp"
  118. app:layout_constraintBottom_toTopOf="@+id/button_C"
  119. app:layout_constraintEnd_toStartOf="@+id/button_Mup"
  120. app:layout_constraintHeight_percent="0.1"
  121. app:layout_constraintStart_toStartOf="parent"
  122. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  123. app:layout_constraintWidth_percent="0.22" />
  124. <Button
  125. android:id="@+id/button_Mup"
  126. style="@style/normalButtonStyle"
  127. android:text="@string/Mup"
  128. android:textSize="25sp"
  129. app:layout_constraintBottom_toTopOf="@+id/button_div"
  130. app:layout_constraintEnd_toStartOf="@+id/button_Mdown"
  131. app:layout_constraintHeight_percent="0.1"
  132. app:layout_constraintStart_toEndOf="@+id/button_MR"
  133. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  134. app:layout_constraintWidth_percent="0.22" />
  135. <Button
  136. android:id="@+id/button_Mdown"
  137. style="@style/normalButtonStyle"
  138. android:text="@string/Mdown"
  139. android:textSize="25sp"
  140. app:layout_constraintBottom_toTopOf="@+id/button_mul"
  141. app:layout_constraintEnd_toStartOf="@+id/button_MC"
  142. app:layout_constraintHeight_percent="0.1"
  143. app:layout_constraintStart_toEndOf="@+id/button_Mup"
  144. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  145. app:layout_constraintWidth_percent="0.22" />
  146. <Button
  147. android:id="@+id/button_MC"
  148. style="@style/deleteButtonStyle"
  149. android:text="@string/MC"
  150. android:textSize="25sp"
  151. app:layout_constraintBottom_toTopOf="@+id/button_CE"
  152. app:layout_constraintEnd_toEndOf="parent"
  153. app:layout_constraintHeight_percent="0.1"
  154. app:layout_constraintStart_toEndOf="@+id/button_Mdown"
  155. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  156. app:layout_constraintWidth_percent="0.22" />
  157. <!--第5行 分别是C,/,*,CE,四个按钮-->
  158. <Button
  159. android:id="@+id/button_C"
  160. style="@style/specialButtonsStyle"
  161. android:text="@string/C"
  162. android:textSize="25sp"
  163. app:layout_constraintBottom_toTopOf="@+id/button_7"
  164. app:layout_constraintEnd_toStartOf="@+id/button_div"
  165. app:layout_constraintHeight_percent="0.1"
  166. app:layout_constraintStart_toStartOf="parent"
  167. app:layout_constraintTop_toBottomOf="@+id/button_MR"
  168. app:layout_constraintWidth_percent="0.22" />
  169. <Button
  170. android:id="@+id/button_div"
  171. style="@style/specialButtonsStyle"
  172. android:text="@string/div"
  173. android:textSize="25sp"
  174. app:layout_constraintBottom_toTopOf="@+id/button_8"
  175. app:layout_constraintEnd_toStartOf="@+id/button_mul"
  176. app:layout_constraintHeight_percent="0.1"
  177. app:layout_constraintStart_toEndOf="@+id/button_C"
  178. app:layout_constraintTop_toBottomOf="@+id/button_Mup"
  179. app:layout_constraintWidth_percent="0.22" />
  180. <Button
  181. android:id="@+id/button_mul"
  182. style="@style/specialButtonsStyle"
  183. android:text="@string/mul"
  184. android:textSize="25sp"
  185. app:layout_constraintBottom_toTopOf="@+id/button_8"
  186. app:layout_constraintEnd_toStartOf="@+id/button_CE"
  187. app:layout_constraintHeight_percent="0.1"
  188. app:layout_constraintStart_toEndOf="@+id/button_div"
  189. app:layout_constraintTop_toBottomOf="@+id/button_Mdown"
  190. app:layout_constraintWidth_percent="0.22" />
  191. <Button
  192. android:id="@+id/button_CE"
  193. style="@style/deleteButtonStyle"
  194. android:text="@string/CE"
  195. android:textSize="25sp"
  196. app:layout_constraintBottom_toTopOf="@+id/button_sub"
  197. app:layout_constraintEnd_toEndOf="parent"
  198. app:layout_constraintHeight_percent="0.1"
  199. app:layout_constraintStart_toEndOf="@+id/button_mul"
  200. app:layout_constraintTop_toBottomOf="@+id/button_MC"
  201. app:layout_constraintWidth_percent="0.22" />
  202. <!--剩下4行的第3列 分别是-,+,=,三个按钮,等于占两列-->
  203. <Button
  204. android:id="@+id/button_sub"
  205. style="@style/specialButtonsStyle"
  206. android:text="@string/sub"
  207. android:textSize="25sp"
  208. app:layout_constraintBottom_toTopOf="@+id/button_add"
  209. app:layout_constraintEnd_toEndOf="parent"
  210. app:layout_constraintHeight_percent="0.1"
  211. app:layout_constraintStart_toEndOf="@+id/button_9"
  212. app:layout_constraintTop_toBottomOf="@+id/button_CE"
  213. app:layout_constraintWidth_percent="0.22" />
  214. <Button
  215. android:id="@+id/button_add"
  216. style="@style/specialButtonsStyle"
  217. android:text="@string/add"
  218. android:textSize="25sp"
  219. app:layout_constraintBottom_toTopOf="@+id/button_equal_To"
  220. app:layout_constraintEnd_toEndOf="parent"
  221. app:layout_constraintHeight_percent="0.1"
  222. app:layout_constraintStart_toEndOf="@+id/button_6"
  223. app:layout_constraintTop_toBottomOf="@+id/button_sub"
  224. app:layout_constraintWidth_percent="0.22" />
  225. <!--10个数字和小数点,其中0占两列-->
  226. <Button
  227. android:id="@+id/button_equal_To"
  228. style="@style/equaltoButtonStyle"
  229. android:text="@string/equal_To"
  230. android:textSize="25sp"
  231. app:layout_constraintBottom_toBottomOf="parent"
  232. app:layout_constraintEnd_toEndOf="parent"
  233. app:layout_constraintHeight_percent="0.21"
  234. app:layout_constraintStart_toEndOf="@+id/button_3"
  235. app:layout_constraintTop_toBottomOf="@+id/button_add"
  236. app:layout_constraintWidth_percent="0.22" />
  237. <Button
  238. android:id="@+id/button_point"
  239. style="@style/digitButtonStyle"
  240. android:text="@string/point"
  241. android:textSize="25sp"
  242. app:layout_constraintBottom_toBottomOf="parent"
  243. app:layout_constraintEnd_toStartOf="@+id/button_equal_To"
  244. app:layout_constraintHeight_percent="0.1"
  245. app:layout_constraintStart_toEndOf="@+id/button_0"
  246. app:layout_constraintTop_toBottomOf="@+id/button_3"
  247. app:layout_constraintWidth_percent="0.22" />
  248. <Button
  249. android:id="@+id/button_0"
  250. style="@style/digitButtonStyle"
  251. android:text="@string/_0"
  252. android:textSize="25sp"
  253. app:layout_constraintBottom_toBottomOf="parent"
  254. app:layout_constraintEnd_toStartOf="@+id/button_point"
  255. app:layout_constraintHeight_percent="0.1"
  256. app:layout_constraintStart_toStartOf="parent"
  257. app:layout_constraintTop_toBottomOf="@+id/button_2"
  258. app:layout_constraintWidth_percent="0.47" />
  259. <Button
  260. android:id="@+id/button_1"
  261. style="@style/digitButtonStyle"
  262. android:text="@string/_1"
  263. android:textSize="25sp"
  264. app:layout_constraintBottom_toTopOf="@+id/button_0"
  265. app:layout_constraintEnd_toStartOf="@+id/button_2"
  266. app:layout_constraintHeight_percent="0.1"
  267. app:layout_constraintStart_toStartOf="parent"
  268. app:layout_constraintTop_toBottomOf="@+id/button_4"
  269. app:layout_constraintWidth_percent="0.22" />
  270. <Button
  271. android:id="@+id/button_2"
  272. style="@style/digitButtonStyle"
  273. android:text="@string/_2"
  274. android:textSize="25sp"
  275. app:layout_constraintBottom_toTopOf="@+id/button_0"
  276. app:layout_constraintEnd_toStartOf="@+id/button_3"
  277. app:layout_constraintHeight_percent="0.1"
  278. app:layout_constraintStart_toEndOf="@+id/button_1"
  279. app:layout_constraintTop_toBottomOf="@+id/button_5"
  280. app:layout_constraintWidth_percent="0.22" />
  281. <Button
  282. android:id="@+id/button_3"
  283. style="@style/digitButtonStyle"
  284. android:text="@string/_3"
  285. android:textSize="25sp"
  286. app:layout_constraintBottom_toTopOf="@+id/button_point"
  287. app:layout_constraintEnd_toStartOf="@+id/button_equal_To"
  288. app:layout_constraintHeight_percent="0.1"
  289. app:layout_constraintStart_toEndOf="@+id/button_2"
  290. app:layout_constraintTop_toBottomOf="@+id/button_5"
  291. app:layout_constraintWidth_percent="0.22" />
  292. <Button
  293. android:id="@+id/button_4"
  294. style="@style/digitButtonStyle"
  295. android:text="@string/_4"
  296. android:textSize="25sp"
  297. app:layout_constraintBottom_toTopOf="@+id/button_1"
  298. app:layout_constraintEnd_toStartOf="@+id/button_5"
  299. app:layout_constraintHeight_percent="0.1"
  300. app:layout_constraintStart_toStartOf="parent"
  301. app:layout_constraintTop_toBottomOf="@+id/button_7"
  302. app:layout_constraintWidth_percent="0.22" />
  303. <Button
  304. android:id="@+id/button_5"
  305. style="@style/digitButtonStyle"
  306. android:text="@string/_5"
  307. android:textSize="25sp"
  308. app:layout_constraintBottom_toTopOf="@+id/button_2"
  309. app:layout_constraintEnd_toStartOf="@+id/button_6"
  310. app:layout_constraintHeight_percent="0.1"
  311. app:layout_constraintStart_toEndOf="@+id/button_4"
  312. app:layout_constraintTop_toBottomOf="@+id/button_8"
  313. app:layout_constraintWidth_percent="0.22" />
  314. <Button
  315. android:id="@+id/button_6"
  316. style="@style/digitButtonStyle"
  317. android:text="@string/_6"
  318. android:textSize="25sp"
  319. app:layout_constraintBottom_toTopOf="@+id/button_3"
  320. app:layout_constraintEnd_toStartOf="@+id/button_add"
  321. app:layout_constraintHeight_percent="0.1"
  322. app:layout_constraintStart_toEndOf="@+id/button_5"
  323. app:layout_constraintTop_toBottomOf="@+id/button_9"
  324. app:layout_constraintWidth_percent="0.22" />
  325. <Button
  326. android:id="@+id/button_7"
  327. style="@style/digitButtonStyle"
  328. android:text="@string/_7"
  329. android:textSize="25sp"
  330. app:layout_constraintBottom_toTopOf="@+id/button_4"
  331. app:layout_constraintEnd_toStartOf="@+id/button_8"
  332. app:layout_constraintHeight_percent="0.1"
  333. app:layout_constraintStart_toStartOf="parent"
  334. app:layout_constraintTop_toBottomOf="@+id/button_C"
  335. app:layout_constraintWidth_percent="0.22" />
  336. <Button
  337. android:id="@+id/button_8"
  338. style="@style/digitButtonStyle"
  339. android:text="@string/_8"
  340. android:textSize="25sp"
  341. app:layout_constraintBottom_toTopOf="@+id/button_5"
  342. app:layout_constraintEnd_toStartOf="@+id/button_9"
  343. app:layout_constraintHeight_percent="0.1"
  344. app:layout_constraintStart_toEndOf="@+id/button_7"
  345. app:layout_constraintTop_toBottomOf="@+id/button_div"
  346. app:layout_constraintWidth_percent="0.22" />
  347. <Button
  348. android:id="@+id/button_9"
  349. style="@style/digitButtonStyle"
  350. android:text="@string/_9"
  351. android:textSize="25sp"
  352. app:layout_constraintBottom_toTopOf="@+id/button_6"
  353. app:layout_constraintEnd_toStartOf="@+id/button_sub"
  354. app:layout_constraintHeight_percent="0.1"
  355. app:layout_constraintStart_toEndOf="@+id/button_8"
  356. app:layout_constraintTop_toBottomOf="@+id/button_mul"
  357. app:layout_constraintWidth_percent="0.22" />
  358. <!--坑是一个接着一个,先是改按钮颜色,这倒没啥,改个主题,但改了主题还想用圆角按钮,
  359. 又整了selector文件。不想一个一个设置,用style,style的问题,
  360. style设置在themes中,这里预览能正确显示,但运行不能。这个确实是自己不知道用法,当时不知道需要新建xml文件。
  361. 当时布局大概完成了,开始整java文件,本来想用js库,类似eval算个字符串,发现倒包不太行,
  362. 又看说这不安全,想一想,自己写个处理算法吧,就一个后缀表达式之类的。就先把按钮侦听器写了,其余的先放了放。
  363. 整横屏时又发现,诶?怎么老调不对,这模拟器怎么不能正确显示?又发现,诶?
  364. 我P30怎么连竖屏都不能正常显示,发现网格布局GridLayout屏幕小的话就不太对劲,
  365. 换!又约束的方式重写布局,多大点事,缝缝补补修好了,别说p30,手表大小的屏幕都能上,
  366. 解决完开始写横屏,嘿,你猜怎么着?屏幕一转,我变量呢?空了?改一下onSaveInstanceState
  367. 发现滚动条无法自动滚动到最右边,初步估计是修改字符串后,会改变控件长度,滚动容器参数没有更新,还以为是之前的长度
  368. 然后试图对MR之类的进行修改,不使用科学计数法,试了几种方法,想看看手机上现有的实现,一试,嘿
  369. 他们也没搞。然后就是添加约束条件,各种比如右括号左边不能直接添加数字,怕到时候栈运算出问题所有-1整个0-1之类的
  370. -->
  371. <!--下面是新加的功能-->
  372. <!--左右括号-->
  373. <!--各种x的幂次方-->
  374. <Button
  375. android:id="@+id/button_left_parenthesis"
  376. style="@style/normalButtonStyle"
  377. android:visibility="gone" />
  378. <Button
  379. android:id="@+id/button_right_parenthesis"
  380. style="@style/normalButtonStyle"
  381. android:visibility="gone" />
  382. <Button
  383. android:id="@+id/button_reciprocal"
  384. style="@style/normalButtonStyle"
  385. android:visibility="gone" />
  386. <Button
  387. android:id="@+id/button_square"
  388. style="@style/normalButtonStyle"
  389. android:visibility="gone" />
  390. <Button
  391. android:id="@+id/button_cubic_power"
  392. style="@style/normalButtonStyle"
  393. android:visibility="gone" />
  394. <Button
  395. android:id="@+id/button_n_power"
  396. style="@style/normalButtonStyle"
  397. android:visibility="gone" />
  398. <Button
  399. android:id="@+id/button_square_root"
  400. style="@style/normalButtonStyle"
  401. android:visibility="gone" />
  402. <Button
  403. android:id="@+id/button_cube_root"
  404. style="@style/normalButtonStyle"
  405. android:visibility="gone" />
  406. <!--e按钮-->
  407. <!--ln和log-->
  408. <!--三角函数们-->
  409. <Button
  410. android:id="@+id/button_n_root"
  411. style="@style/normalButtonStyle"
  412. android:visibility="gone" />
  413. <Button
  414. android:id="@+id/button_e"
  415. style="@style/normalButtonStyle"
  416. android:visibility="gone" />
  417. <Button
  418. android:id="@+id/button_ln"
  419. style="@style/normalButtonStyle"
  420. android:visibility="gone" />
  421. <Button
  422. android:id="@+id/button_log"
  423. style="@style/normalButtonStyle"
  424. android:visibility="gone" />
  425. <Button
  426. android:id="@+id/button_sin"
  427. style="@style/normalButtonStyle"
  428. android:visibility="gone" />
  429. <!--变换按钮-->
  430. <Button
  431. android:id="@+id/button_cos"
  432. style="@style/normalButtonStyle"
  433. android:visibility="gone" />
  434. <Button
  435. android:id="@+id/button_tan"
  436. style="@style/normalButtonStyle"
  437. android:visibility="gone" />
  438. <Button
  439. android:id="@+id/button_idaoi"
  440. style="@style/normalButtonStyle"
  441. android:visibility="gone" />
  442. <Button
  443. android:id="@+id/button_pi"
  444. style="@style/normalButtonStyle"
  445. android:visibility="gone" />
  446. <Button
  447. android:id="@+id/button_inv"
  448. style="@style/normalButtonStyle"
  449. android:visibility="gone" />
  450. </androidx.constraintlayout.widget.ConstraintLayout>

横屏:
  1. <?xml version="1.0" encoding="utf-8"?><!--这是横屏布局
  2. 最大7列,10行,长宽全占满
  3. -->
  4. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  5. xmlns:app="http://schemas.android.com/apk/res-auto"
  6. xmlns:tools="http://schemas.android.com/tools"
  7. style="@style/layoutStyle"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. tools:context=".MainActivity">
  11. <!--这一部分和前面一样,就是改了一下第一行,和部分参数和部分绑定控制
  12. 要看新加的功能移步372行-->
  13. <!--第0行有M标志,切换横竖屏的按钮-->
  14. <!--中间是上回的结果,叫文本框——上次,
  15. 后来设计有变,改为储存表达式的文本
  16. 初始没文本,在第1行,在第0列,占4列,占1行,
  17. 为了水平滚动,加了滚动容器
  18. -->
  19. <TextView
  20. android:id="@+id/textView_M"
  21. style="@style/lastTextBoxStyle"
  22. android:text="@string/M"
  23. app:layout_constraintBottom_toTopOf="@+id/textView_Equation"
  24. app:layout_constraintEnd_toStartOf="@+id/horizonLayout_Last"
  25. app:layout_constraintHeight_percent="0.1 "
  26. app:layout_constraintStart_toStartOf="parent"
  27. app:layout_constraintTop_toTopOf="parent"
  28. app:layout_constraintWidth_percent="0.1 " />
  29. <HorizontalScrollView
  30. android:id="@+id/horizonLayout_Last"
  31. style="@style/lastTextBoxStyle"
  32. android:scrollbars="vertical"
  33. app:layout_constraintEnd_toStartOf="@+id/button_rotate"
  34. app:layout_constraintHeight_percent="0.1 "
  35. app:layout_constraintStart_toEndOf="@+id/textView_M"
  36. app:layout_constraintTop_toTopOf="parent"
  37. app:layout_constraintWidth_percent="0.8">
  38. <TextView
  39. android:id="@+id/textView_Last"
  40. style="@style/lastTextBoxStyle"
  41. android:layout_width="wrap_content"
  42. android:layout_height="match_parent"
  43. android:layout_gravity="end"
  44. android:gravity="end"
  45. android:maxLines="1"
  46. android:scrollbars="vertical"
  47. android:text=""
  48. android:textSize="24sp"
  49. app:layout_constraintEnd_toEndOf="parent"
  50. app:layout_constraintStart_toStartOf="parent" />
  51. </HorizontalScrollView>
  52. <Button
  53. android:id="@+id/button_rotate"
  54. style="@style/lastTextBoxStyle"
  55. android:text="@string/rotate"
  56. app:layout_constraintBottom_toTopOf="@+id/textView_Equation"
  57. app:layout_constraintEnd_toEndOf="parent"
  58. app:layout_constraintHeight_percent="0.1 "
  59. app:layout_constraintStart_toEndOf="@+id/horizonLayout_Last"
  60. app:layout_constraintTop_toTopOf="parent"
  61. app:layout_constraintWidth_percent="0.1 " />
  62. <!--第2行是算式,叫文本框——方程
  63. 初始没文本,粗体,在第2行,在第0列,占4列,占1行,
  64. gravity="end":文本靠右,只显示一行文本,不换行
  65. -->
  66. <EditText
  67. android:id="@+id/textView_Equation"
  68. style="@style/editTextBoxStyle"
  69. android:focusableInTouchMode="false"
  70. android:gravity="right"
  71. android:marqueeRepeatLimit="marquee_forever"
  72. android:singleLine="true"
  73. android:text=""
  74. android:textSize="50sp"
  75. app:layout_constraintEnd_toEndOf="parent"
  76. app:layout_constraintHeight_percent="0.2"
  77. app:layout_constraintStart_toStartOf="parent"
  78. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Last"
  79. app:layout_constraintWidth_percent="1" />
  80. <!--当前结果
  81. 初始没文本,在第3行,在第0列,占4列,占1行,
  82. gravity="end":文本靠右-->
  83. <HorizontalScrollView
  84. android:id="@+id/horizonLayout_Now"
  85. style="@style/lastTextBoxStyle"
  86. android:scrollbars="vertical"
  87. app:layout_constraintEnd_toEndOf="parent"
  88. app:layout_constraintHeight_percent="0.1 "
  89. app:layout_constraintStart_toStartOf="parent"
  90. app:layout_constraintTop_toBottomOf="@+id/textView_Equation"
  91. app:layout_constraintWidth_percent="1">
  92. <TextView
  93. android:id="@+id/textView_Now"
  94. style="@style/lastTextBoxStyle"
  95. android:layout_width="wrap_content"
  96. android:layout_height="match_parent"
  97. android:layout_gravity="end"
  98. android:gravity="end"
  99. android:maxLines="1"
  100. android:scrollbars="vertical"
  101. android:text=""
  102. android:textSize="24sp"
  103. app:layout_constraintEnd_toEndOf="parent"
  104. app:layout_constraintStart_toStartOf="parent" />
  105. </HorizontalScrollView>
  106. <!--第4行 分别是MR,M+,M-,MC,四个按钮-->
  107. <Button
  108. android:id="@+id/button_MR"
  109. style="@style/normalButtonStyle"
  110. android:text="@string/MR"
  111. android:textSize="21sp"
  112. app:layout_constraintBottom_toTopOf="@+id/button_C"
  113. app:layout_constraintEnd_toStartOf="@+id/button_Mup"
  114. app:layout_constraintHeight_percent="0.08"
  115. app:layout_constraintStart_toEndOf="@+id/button_reciprocal"
  116. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  117. app:layout_constraintWidth_percent="0.13" />
  118. <Button
  119. android:id="@+id/button_Mup"
  120. style="@style/normalButtonStyle"
  121. android:text="@string/Mup"
  122. android:textSize="21sp"
  123. app:layout_constraintBottom_toTopOf="@+id/button_div"
  124. app:layout_constraintEnd_toStartOf="@+id/button_Mdown"
  125. app:layout_constraintHeight_percent="0.08"
  126. app:layout_constraintStart_toEndOf="@+id/button_MR"
  127. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  128. app:layout_constraintWidth_percent="0.13" />
  129. <Button
  130. android:id="@+id/button_Mdown"
  131. style="@style/normalButtonStyle"
  132. android:text="@string/Mdown"
  133. android:textSize="21sp"
  134. app:layout_constraintBottom_toTopOf="@+id/button_mul"
  135. app:layout_constraintEnd_toStartOf="@+id/button_MC"
  136. app:layout_constraintHeight_percent="0.08"
  137. app:layout_constraintStart_toEndOf="@+id/button_Mup"
  138. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  139. app:layout_constraintWidth_percent="0.13" />
  140. <!--第5行 分别是C,/,*,CE,四个按钮-->
  141. <Button
  142. android:id="@+id/button_MC"
  143. style="@style/deleteButtonStyle"
  144. android:text="@string/MC"
  145. android:textSize="21sp"
  146. app:layout_constraintBottom_toTopOf="@+id/button_CE"
  147. app:layout_constraintEnd_toEndOf="parent"
  148. app:layout_constraintHeight_percent="0.08"
  149. app:layout_constraintStart_toEndOf="@+id/button_Mdown"
  150. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  151. app:layout_constraintWidth_percent="0.13" />
  152. <Button
  153. android:id="@+id/button_C"
  154. style="@style/specialButtonsStyle"
  155. android:text="@string/C"
  156. android:textSize="21sp"
  157. app:layout_constraintBottom_toTopOf="@+id/button_7"
  158. app:layout_constraintEnd_toStartOf="@+id/button_div"
  159. app:layout_constraintHeight_percent="0.08"
  160. app:layout_constraintStart_toEndOf="@+id/button_n_power"
  161. app:layout_constraintTop_toBottomOf="@+id/button_MR"
  162. app:layout_constraintWidth_percent="0.13" />
  163. <Button
  164. android:id="@+id/button_div"
  165. style="@style/specialButtonsStyle"
  166. android:text="@string/div"
  167. android:textSize="21sp"
  168. app:layout_constraintBottom_toTopOf="@+id/button_8"
  169. app:layout_constraintEnd_toStartOf="@+id/button_mul"
  170. app:layout_constraintHeight_percent="0.08"
  171. app:layout_constraintStart_toEndOf="@+id/button_C"
  172. app:layout_constraintTop_toBottomOf="@+id/button_Mup"
  173. app:layout_constraintWidth_percent="0.13" />
  174. <Button
  175. android:id="@+id/button_mul"
  176. style="@style/specialButtonsStyle"
  177. android:text="@string/mul"
  178. android:textSize="21sp"
  179. app:layout_constraintBottom_toTopOf="@+id/button_9"
  180. app:layout_constraintEnd_toStartOf="@+id/button_CE"
  181. app:layout_constraintHeight_percent="0.08"
  182. app:layout_constraintStart_toEndOf="@+id/button_div"
  183. app:layout_constraintTop_toBottomOf="@+id/button_Mdown"
  184. app:layout_constraintWidth_percent="0.13" />
  185. <Button
  186. android:id="@+id/button_CE"
  187. style="@style/deleteButtonStyle"
  188. android:text="@string/CE"
  189. android:textSize="21sp"
  190. app:layout_constraintBottom_toTopOf="@+id/button_sub"
  191. app:layout_constraintEnd_toEndOf="parent"
  192. app:layout_constraintHeight_percent="0.08"
  193. app:layout_constraintStart_toEndOf="@+id/button_mul"
  194. app:layout_constraintTop_toBottomOf="@+id/button_MC"
  195. app:layout_constraintWidth_percent="0.13" />
  196. <!--剩下4行的第3列 分别是-,+,=,三个按钮,等于占两列-->
  197. <Button
  198. android:id="@+id/button_sub"
  199. style="@style/specialButtonsStyle"
  200. android:text="@string/sub"
  201. android:textSize="21sp"
  202. app:layout_constraintBottom_toTopOf="@+id/button_add"
  203. app:layout_constraintEnd_toEndOf="parent"
  204. app:layout_constraintHeight_percent="0.08"
  205. app:layout_constraintStart_toEndOf="@+id/button_9"
  206. app:layout_constraintTop_toBottomOf="@+id/button_CE"
  207. app:layout_constraintWidth_percent="0.13" />
  208. <Button
  209. android:id="@+id/button_add"
  210. style="@style/specialButtonsStyle"
  211. android:text="@string/add"
  212. android:textSize="21sp"
  213. app:layout_constraintBottom_toTopOf="@+id/button_equal_To"
  214. app:layout_constraintEnd_toEndOf="parent"
  215. app:layout_constraintHeight_percent="0.08"
  216. app:layout_constraintStart_toEndOf="@+id/button_6"
  217. app:layout_constraintTop_toBottomOf="@+id/button_sub"
  218. app:layout_constraintWidth_percent="0.13" />
  219. <!--10个数字和小数点,其中0占两列-->
  220. <Button
  221. android:id="@+id/button_equal_To"
  222. style="@style/equaltoButtonStyle"
  223. android:text="@string/equal_To"
  224. android:textSize="21sp"
  225. app:layout_constraintBottom_toBottomOf="parent"
  226. app:layout_constraintEnd_toEndOf="parent"
  227. app:layout_constraintHeight_percent="0.18"
  228. app:layout_constraintStart_toEndOf="@+id/button_3"
  229. app:layout_constraintTop_toBottomOf="@+id/button_add"
  230. app:layout_constraintWidth_percent="0.13" />
  231. <Button
  232. android:id="@+id/button_point"
  233. style="@style/digitButtonStyle"
  234. android:text="@string/point"
  235. android:textSize="21sp"
  236. app:layout_constraintBottom_toBottomOf="parent"
  237. app:layout_constraintEnd_toStartOf="@+id/button_equal_To"
  238. app:layout_constraintHeight_percent="0.08"
  239. app:layout_constraintStart_toEndOf="@+id/button_0"
  240. app:layout_constraintTop_toBottomOf="@+id/button_3"
  241. app:layout_constraintWidth_percent="0.13" />
  242. <Button
  243. android:id="@+id/button_0"
  244. style="@style/digitButtonStyle"
  245. android:text="@string/_0"
  246. android:textSize="21sp"
  247. app:layout_constraintBottom_toBottomOf="parent"
  248. app:layout_constraintEnd_toStartOf="@+id/button_point"
  249. app:layout_constraintHeight_percent="0.08"
  250. app:layout_constraintStart_toEndOf="@+id/button_pi"
  251. app:layout_constraintTop_toBottomOf="@+id/button_2"
  252. app:layout_constraintWidth_percent="0.28" />
  253. <Button
  254. android:id="@+id/button_1"
  255. style="@style/digitButtonStyle"
  256. android:text="@string/_1"
  257. android:textSize="21sp"
  258. app:layout_constraintBottom_toTopOf="@+id/button_0"
  259. app:layout_constraintEnd_toStartOf="@+id/button_2"
  260. app:layout_constraintHeight_percent="0.08"
  261. app:layout_constraintStart_toEndOf="@+id/button_tan"
  262. app:layout_constraintTop_toBottomOf="@+id/button_4"
  263. app:layout_constraintWidth_percent="0.13" />
  264. <Button
  265. android:id="@+id/button_2"
  266. style="@style/digitButtonStyle"
  267. android:text="@string/_2"
  268. android:textSize="21sp"
  269. app:layout_constraintBottom_toTopOf="@+id/button_0"
  270. app:layout_constraintEnd_toStartOf="@+id/button_3"
  271. app:layout_constraintHeight_percent="0.08"
  272. app:layout_constraintStart_toEndOf="@+id/button_1"
  273. app:layout_constraintTop_toBottomOf="@+id/button_5"
  274. app:layout_constraintWidth_percent="0.13" />
  275. <Button
  276. android:id="@+id/button_3"
  277. style="@style/digitButtonStyle"
  278. android:text="@string/_3"
  279. android:textSize="21sp"
  280. app:layout_constraintBottom_toTopOf="@+id/button_point"
  281. app:layout_constraintEnd_toStartOf="@+id/button_equal_To"
  282. app:layout_constraintHeight_percent="0.08"
  283. app:layout_constraintStart_toEndOf="@+id/button_2"
  284. app:layout_constraintTop_toBottomOf="@+id/button_6"
  285. app:layout_constraintWidth_percent="0.13" />
  286. <Button
  287. android:id="@+id/button_4"
  288. style="@style/digitButtonStyle"
  289. android:text="@string/_4"
  290. android:textSize="21sp"
  291. app:layout_constraintBottom_toTopOf="@+id/button_1"
  292. app:layout_constraintEnd_toStartOf="@+id/button_5"
  293. app:layout_constraintHeight_percent="0.08"
  294. app:layout_constraintStart_toEndOf="@+id/button_log"
  295. app:layout_constraintTop_toBottomOf="@+id/button_7"
  296. app:layout_constraintWidth_percent="0.13" />
  297. <Button
  298. android:id="@+id/button_5"
  299. style="@style/digitButtonStyle"
  300. android:text="@string/_5"
  301. android:textSize="21sp"
  302. app:layout_constraintBottom_toTopOf="@+id/button_2"
  303. app:layout_constraintEnd_toStartOf="@+id/button_6"
  304. app:layout_constraintHeight_percent="0.08"
  305. app:layout_constraintStart_toEndOf="@+id/button_4"
  306. app:layout_constraintTop_toBottomOf="@+id/button_8"
  307. app:layout_constraintWidth_percent="0.13" />
  308. <Button
  309. android:id="@+id/button_6"
  310. style="@style/digitButtonStyle"
  311. android:text="@string/_6"
  312. android:textSize="21sp"
  313. app:layout_constraintBottom_toTopOf="@+id/button_3"
  314. app:layout_constraintEnd_toStartOf="@+id/button_add"
  315. app:layout_constraintHeight_percent="0.08"
  316. app:layout_constraintStart_toEndOf="@+id/button_5"
  317. app:layout_constraintTop_toBottomOf="@+id/button_9"
  318. app:layout_constraintWidth_percent="0.13" />
  319. <Button
  320. android:id="@+id/button_7"
  321. style="@style/digitButtonStyle"
  322. android:text="@string/_7"
  323. android:textSize="21sp"
  324. app:layout_constraintBottom_toTopOf="@+id/button_4"
  325. app:layout_constraintEnd_toStartOf="@+id/button_8"
  326. app:layout_constraintHeight_percent="0.08"
  327. app:layout_constraintStart_toEndOf="@+id/button_n_root"
  328. app:layout_constraintTop_toBottomOf="@+id/button_C"
  329. app:layout_constraintWidth_percent="0.13" />
  330. <Button
  331. android:id="@+id/button_8"
  332. style="@style/digitButtonStyle"
  333. android:text="@string/_8"
  334. android:textSize="21sp"
  335. app:layout_constraintBottom_toTopOf="@+id/button_5"
  336. app:layout_constraintEnd_toStartOf="@+id/button_9"
  337. app:layout_constraintHeight_percent="0.08"
  338. app:layout_constraintStart_toEndOf="@+id/button_7"
  339. app:layout_constraintTop_toBottomOf="@+id/button_div"
  340. app:layout_constraintWidth_percent="0.13" />
  341. <Button
  342. android:id="@+id/button_9"
  343. style="@style/digitButtonStyle"
  344. android:text="@string/_9"
  345. android:textSize="21sp"
  346. app:layout_constraintBottom_toTopOf="@+id/button_6"
  347. app:layout_constraintEnd_toStartOf="@+id/button_sub"
  348. app:layout_constraintHeight_percent="0.08"
  349. app:layout_constraintStart_toEndOf="@+id/button_8"
  350. app:layout_constraintTop_toBottomOf="@+id/button_mul"
  351. app:layout_constraintWidth_percent="0.13" />
  352. <!--下面是新加的功能-->
  353. <!--左右括号-->
  354. <!--各种x的幂次方-->
  355. <Button
  356. android:id="@+id/button_left_parenthesis"
  357. style="@style/normalButtonStyle"
  358. android:text="@string/left_parenthesis"
  359. android:textSize="21sp"
  360. app:layout_constraintBottom_toTopOf="@+id/button_square"
  361. app:layout_constraintEnd_toStartOf="@+id/button_right_parenthesis"
  362. app:layout_constraintHeight_percent="0.08"
  363. app:layout_constraintStart_toStartOf="parent"
  364. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  365. app:layout_constraintWidth_percent="0.13" />
  366. <Button
  367. android:id="@+id/button_right_parenthesis"
  368. style="@style/normalButtonStyle"
  369. android:text="@string/right_parenthesis"
  370. android:textSize="21sp"
  371. app:layout_constraintBottom_toTopOf="@+id/button_cubic_power"
  372. app:layout_constraintEnd_toStartOf="@+id/button_reciprocal"
  373. app:layout_constraintHeight_percent="0.08"
  374. app:layout_constraintStart_toEndOf="@+id/button_left_parenthesis"
  375. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  376. app:layout_constraintWidth_percent="0.13" />
  377. <Button
  378. android:id="@+id/button_reciprocal"
  379. style="@style/normalButtonStyle"
  380. android:text="@string/reciprocal"
  381. android:textAllCaps="false"
  382. android:textSize="21sp"
  383. app:layout_constraintBottom_toTopOf="@+id/button_n_power"
  384. app:layout_constraintEnd_toStartOf="@+id/button_MR"
  385. app:layout_constraintHeight_percent="0.08"
  386. app:layout_constraintStart_toEndOf="@+id/button_right_parenthesis"
  387. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
  388. app:layout_constraintWidth_percent="0.13" />
  389. <Button
  390. android:id="@+id/button_square"
  391. style="@style/normalButtonStyle"
  392. android:text="@string/square"
  393. android:textAllCaps="false"
  394. android:textSize="21sp"
  395. app:layout_constraintBottom_toTopOf="@+id/button_square_root"
  396. app:layout_constraintEnd_toStartOf="@+id/button_cubic_power"
  397. app:layout_constraintHeight_percent="0.08"
  398. app:layout_constraintStart_toStartOf="parent"
  399. app:layout_constraintTop_toBottomOf="@+id/button_left_parenthesis"
  400. app:layout_constraintWidth_percent="0.13" />
  401. <Button
  402. android:id="@+id/button_cubic_power"
  403. style="@style/normalButtonStyle"
  404. android:text="@string/cubic_power"
  405. android:textAllCaps="false"
  406. android:textSize="21sp"
  407. app:layout_constraintBottom_toTopOf="@+id/button_cube_root"
  408. app:layout_constraintEnd_toStartOf="@+id/button_n_power"
  409. app:layout_constraintHeight_percent="0.08"
  410. app:layout_constraintStart_toEndOf="@+id/button_square"
  411. app:layout_constraintTop_toBottomOf="@+id/button_right_parenthesis"
  412. app:layout_constraintWidth_percent="0.13" />
  413. <Button
  414. android:id="@+id/button_n_power"
  415. style="@style/normalButtonStyle"
  416. android:text="@string/n_power"
  417. android:textAllCaps="false"
  418. android:textSize="21sp"
  419. app:layout_constraintBottom_toTopOf="@+id/button_n_root"
  420. app:layout_constraintEnd_toStartOf="@+id/button_C"
  421. app:layout_constraintHeight_percent="0.08"
  422. app:layout_constraintStart_toEndOf="@+id/button_cubic_power"
  423. app:layout_constraintTop_toBottomOf="@+id/button_reciprocal"
  424. app:layout_constraintWidth_percent="0.13" />
  425. <Button
  426. android:id="@+id/button_square_root"
  427. style="@style/normalButtonStyle"
  428. android:text="@string/square_root"
  429. android:textAllCaps="false"
  430. android:textSize="21sp"
  431. app:layout_constraintBottom_toTopOf="@+id/button_e"
  432. app:layout_constraintEnd_toStartOf="@+id/button_cube_root"
  433. app:layout_constraintHeight_percent="0.08"
  434. app:layout_constraintStart_toStartOf="parent"
  435. app:layout_constraintTop_toBottomOf="@+id/button_square"
  436. app:layout_constraintWidth_percent="0.13" />
  437. <Button
  438. android:id="@+id/button_cube_root"
  439. style="@style/normalButtonStyle"
  440. android:text="@string/cube_root"
  441. android:textAllCaps="false"
  442. android:textSize="21sp"
  443. app:layout_constraintBottom_toTopOf="@+id/button_ln"
  444. app:layout_constraintEnd_toStartOf="@+id/button_n_root"
  445. app:layout_constraintHeight_percent="0.08"
  446. app:layout_constraintStart_toEndOf="@+id/button_square_root"
  447. app:layout_constraintTop_toBottomOf="@+id/button_cubic_power"
  448. app:layout_constraintWidth_percent="0.13" />
  449. <!--e按钮-->
  450. <!--ln和log-->
  451. <!--三角函数们-->
  452. <Button
  453. android:id="@+id/button_n_root"
  454. style="@style/normalButtonStyle"
  455. android:text="@string/n_root"
  456. android:textAllCaps="false"
  457. android:textSize="21sp"
  458. app:layout_constraintBottom_toTopOf="@+id/button_log"
  459. app:layout_constraintEnd_toStartOf="@+id/button_7"
  460. app:layout_constraintHeight_percent="0.08"
  461. app:layout_constraintStart_toEndOf="@+id/button_cube_root"
  462. app:layout_constraintTop_toBottomOf="@+id/button_n_power"
  463. app:layout_constraintWidth_percent="0.13" />
  464. <Button
  465. android:id="@+id/button_e"
  466. style="@style/normalButtonStyle"
  467. android:text="@string/e"
  468. android:textAllCaps="false"
  469. android:textSize="21sp"
  470. app:layout_constraintBottom_toTopOf="@+id/button_sin"
  471. app:layout_constraintEnd_toStartOf="@+id/button_ln"
  472. app:layout_constraintHeight_percent="0.08"
  473. app:layout_constraintStart_toStartOf="parent"
  474. app:layout_constraintTop_toBottomOf="@+id/button_square_root"
  475. app:layout_constraintWidth_percent="0.13" />
  476. <Button
  477. android:id="@+id/button_ln"
  478. style="@style/normalButtonStyle"
  479. android:text="@string/ln"
  480. android:textAllCaps="false"
  481. android:textSize="21sp"
  482. app:layout_constraintBottom_toTopOf="@+id/button_cos"
  483. app:layout_constraintEnd_toStartOf="@+id/button_log"
  484. app:layout_constraintHeight_percent="0.08"
  485. app:layout_constraintStart_toEndOf="@+id/button_e"
  486. app:layout_constraintTop_toBottomOf="@+id/button_cube_root"
  487. app:layout_constraintWidth_percent="0.13" />
  488. <Button
  489. android:id="@+id/button_log"
  490. style="@style/normalButtonStyle"
  491. android:text="@string/log"
  492. android:textAllCaps="false"
  493. android:textSize="21sp"
  494. app:layout_constraintBottom_toTopOf="@+id/button_tan"
  495. app:layout_constraintEnd_toStartOf="@+id/button_4"
  496. app:layout_constraintHeight_percent="0.08"
  497. app:layout_constraintStart_toEndOf="@+id/button_ln"
  498. app:layout_constraintTop_toBottomOf="@+id/button_n_root"
  499. app:layout_constraintWidth_percent="0.13" />
  500. <Button
  501. android:id="@+id/button_sin"
  502. style="@style/normalButtonStyle"
  503. android:text="@string/sin"
  504. android:textAllCaps="false"
  505. android:textSize="21sp"
  506. app:layout_constraintBottom_toTopOf="@+id/button_inv"
  507. app:layout_constraintEnd_toStartOf="@+id/button_cos"
  508. app:layout_constraintHeight_percent="0.08"
  509. app:layout_constraintStart_toStartOf="parent"
  510. app:layout_constraintTop_toBottomOf="@+id/button_e"
  511. app:layout_constraintWidth_percent="0.13" />
  512. <!--变换按钮-->
  513. <Button
  514. android:id="@+id/button_cos"
  515. style="@style/normalButtonStyle"
  516. android:text="@string/cos"
  517. android:textAllCaps="false"
  518. android:textSize="21sp"
  519. app:layout_constraintBottom_toTopOf="@+id/button_idaoi"
  520. app:layout_constraintEnd_toStartOf="@+id/button_tan"
  521. app:layout_constraintHeight_percent="0.08"
  522. app:layout_constraintStart_toEndOf="@+id/button_sin"
  523. app:layout_constraintTop_toBottomOf="@+id/button_ln"
  524. app:layout_constraintWidth_percent="0.13" />
  525. <Button
  526. android:id="@+id/button_tan"
  527. style="@style/normalButtonStyle"
  528. android:text="@string/tan"
  529. android:textAllCaps="false"
  530. android:textSize="21sp"
  531. app:layout_constraintBottom_toTopOf="@+id/button_pi"
  532. app:layout_constraintEnd_toStartOf="@+id/button_1"
  533. app:layout_constraintHeight_percent="0.08"
  534. app:layout_constraintStart_toEndOf="@+id/button_cos"
  535. app:layout_constraintTop_toBottomOf="@+id/button_log"
  536. app:layout_constraintWidth_percent="0.13" />
  537. <Button
  538. android:id="@+id/button_idaoi"
  539. style="@style/normalButtonStyle"
  540. android:text="@string/idaoi"
  541. android:textAllCaps="false"
  542. android:textSize="21sp"
  543. app:layout_constraintBottom_toBottomOf="parent"
  544. app:layout_constraintEnd_toStartOf="@+id/button_pi"
  545. app:layout_constraintHeight_percent="0.08"
  546. app:layout_constraintStart_toEndOf="@+id/button_inv"
  547. app:layout_constraintTop_toBottomOf="@+id/button_cos"
  548. app:layout_constraintWidth_percent="0.13" />
  549. <Button
  550. android:id="@+id/button_pi"
  551. style="@style/normalButtonStyle"
  552. android:text="@string/pi"
  553. android:textAllCaps="false"
  554. android:textSize="21sp"
  555. app:layout_constraintBottom_toBottomOf="parent"
  556. app:layout_constraintEnd_toStartOf="@+id/button_1"
  557. app:layout_constraintHeight_percent="0.08"
  558. app:layout_constraintStart_toEndOf="@+id/button_idaoi"
  559. app:layout_constraintTop_toBottomOf="@+id/button_tan"
  560. app:layout_constraintWidth_percent="0.13" />
  561. <Button
  562. android:id="@+id/button_inv"
  563. style="@style/normalButtonStyle"
  564. android:text="@string/square_inv"
  565. android:textAllCaps="false"
  566. android:textSize="21sp"
  567. app:layout_constraintBottom_toBottomOf="parent"
  568. app:layout_constraintEnd_toStartOf="@+id/button_idaoi"
  569. app:layout_constraintHeight_percent="0.08"
  570. app:layout_constraintStart_toStartOf="parent"
  571. app:layout_constraintTop_toBottomOf="@+id/button_sin"
  572. app:layout_constraintWidth_percent="0.13" />
  573. </androidx.constraintlayout.widget.ConstraintLayout>

我该最后粘贴代码的,越写越卡了。

values

        colors.xml

        一些颜色的定义,获得16进制颜色有很多方法,我用的是画图3D来取色,你也可以用它打开图片,然后直接选中图片的颜色。后续版本我会添加多页面,可能会添加相应功能(画大饼,大概率不写)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!--这个文件来定义设定的颜色-->
  4. <color name="black">#FF000000</color>
  5. <color name="white">#FFFFFFFF</color>
  6. <color name="c_black">#000000</color>
  7. <color name="c_light_background">#303030</color>
  8. <color name="c_light_button">#404040</color>
  9. <color name="c_white">#FFFFFF</color>
  10. <color name="c_blue">#506EF0</color>
  11. <color name="c_blue_">#2A40C0</color>
  12. <color name="c_orange">#FFBB40</color>
  13. <color name="c_orange_">#FFA400</color>
  14. <color name="c_light_grey">#EAEAEE</color>
  15. <color name="c_grey">#CDCDD2</color>
  16. <color name="c_dark_grey">#9696A0</color>
  17. </resources>
strings.xml

定义字符串的,其中,第一个name="app_name"这个,设定的是应用的名字,就是图标下面显示的名字。

  1. <resources>
  2. <!--这个文件来定义设定的字符串-->
  3. <string name="app_name">i道i的计算器</string>
  4. <string name="idaoi">i道i</string>
  5. <string name="M">M</string>
  6. <string name="MR">MR</string>
  7. <string name="Mup">M+</string>
  8. <string name="Mdown">M-</string>
  9. <string name="MC">MC</string>
  10. <string name="add">+</string>
  11. <string name="sub">-</string>
  12. <string name="mul">×</string>
  13. <string name="div">÷</string>
  14. <string name="C">C</string>
  15. <string name="CE">退格</string>
  16. <string name="point">.</string>
  17. <string name="equal_To">=</string>
  18. <string name="_0">0</string>
  19. <string name="_1">1</string>
  20. <string name="_2">2</string>
  21. <string name="_3">3</string>
  22. <string name="_4">4</string>
  23. <string name="_5">5</string>
  24. <string name="_6">6</string>
  25. <string name="_7">7</string>
  26. <string name="_8">8</string>
  27. <string name="_9">9</string>
  28. <string name="rotate"></string>
  29. <string name="error">错误</string>
  30. <string name="NULL">NULL</string>
  31. <string name="e">e</string>
  32. <string name="pi">π</string>
  33. <string name="left_parenthesis">(</string>
  34. <string name="right_parenthesis">)</string>
  35. <string name="reciprocal">1/x</string>
  36. <string name="square"></string>
  37. <string name="cubic_power"></string>
  38. <string name="n_power">xⁿ</string>
  39. <string name="square_root">²√</string>
  40. <string name="cube_root">³√</string>
  41. <string name="n_root">ⁿ√</string>
  42. <string name="square_inv">Inv</string>
  43. <string name="ln">ln</string>
  44. <string name="log">log</string>
  45. <string name="e_root">eⁿ</string>
  46. <string name="ten_power">10ⁿ</string>
  47. <string name="sin">sin</string>
  48. <string name="cos">cos</string>
  49. <string name="tan">tan</string>
  50. <string name="sin_">sin⁻¹</string>
  51. <string name="cos_">cos⁻¹</string>
  52. <string name="tan_">tan⁻¹</string>
  53. </resources>
styles

当你创建多个styles.xml文件时,虚拟目录这里才会给你整个文件夹包起来,项目目录如下:

带-night是暗色模式使用的,就是你手机上的深色模式,如果深色模式文件夹里有就会用深色模式文件夹里的,没有就用浅色模式中的东西。

styles.xml初始是不自带的,你需要自己创建。

浅色模式

说起来也是大同小异,这东西相当于设定一个模板,然后你就在布局中套用这个模板就行。跟类一样,甚至可以继承。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!--布局-->
  4. <style name="layoutStyle">
  5. <item name="android:background">@color/c_light_grey</item>
  6. <item name="android:textColor">@color/c_dark_grey</item>
  7. <item name="android:layout_width">0dp</item>
  8. <item name="android:layout_height">0dp</item>
  9. </style>
  10. <!--上次文本框-->
  11. <style name="lastTextBoxStyle">
  12. <item name="android:background">@color/c_white</item>
  13. <item name="android:textColor">@color/c_dark_grey</item>
  14. <item name="android:layout_width">0dp</item>
  15. <item name="android:layout_height">0dp</item>
  16. </style>
  17. <!--文本框-->
  18. <style name="editTextBoxStyle">
  19. <item name="android:textStyle">bold</item>
  20. <item name="android:background">@color/c_white</item>
  21. <item name="android:textColor">@color/c_black</item>
  22. <item name="android:layout_width">0dp</item>
  23. <item name="android:layout_height">0dp</item>
  24. </style>
  25. <!--数字按钮,数字按钮的颜色
  26. 白背景,黑文字-->
  27. <style name="digitButtonStyle">
  28. <item name="android:background">@drawable/whitebutton</item>
  29. <item name="android:textColor">@color/c_black</item>
  30. <item name="android:layout_width">0dp</item>
  31. <item name="android:layout_height">0dp</item>
  32. </style>
  33. <!--普通按钮,普通功能的颜色
  34. 灰色背景,黑文字-->
  35. <style name="normalButtonStyle">
  36. <item name="android:background">@drawable/greybutton</item>
  37. <item name="android:textColor">@color/c_black</item>
  38. <item name="android:layout_width">0dp</item>
  39. <item name="android:layout_height">0dp</item>
  40. </style>
  41. <!--特殊按钮,常用功能的颜色
  42. 灰色背景,蓝色文字-->
  43. <style name="specialButtonsStyle">
  44. <item name="android:background">@drawable/greybutton</item>
  45. <item name="android:textColor">@color/c_blue</item>
  46. <item name="android:layout_width">0dp</item>
  47. <item name="android:layout_height">0dp</item>
  48. </style>
  49. <!--删除按钮,CE和C的颜色
  50. 橙色背景,白色文字-->
  51. <style name="deleteButtonStyle">
  52. <item name="android:background">@drawable/orangebuttons</item>
  53. <item name="android:textColor">@color/c_white</item>
  54. <item name="android:layout_width">0dp</item>
  55. <item name="android:layout_height">0dp</item>
  56. </style>
  57. <!--等于按钮,蓝色背景,白色文字-->
  58. <style name="equaltoButtonStyle">
  59. <item name="android:background">@drawable/bluebuttons</item>
  60. <item name="android:textColor">@color/c_white</item>
  61. <item name="android:layout_width">0dp</item>
  62. <item name="android:layout_height">0dp</item>
  63. </style>
  64. </resources>
深色模式
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <!--布局-->
  4. <style name="layoutStyle">
  5. <item name="android:background">@color/c_light_background</item>
  6. <item name="android:textColor">@color/c_grey</item>
  7. <item name="android:layout_width">0dp</item>
  8. <item name="android:layout_height">0dp</item>
  9. </style>
  10. <!--上次文本框-->
  11. <style name="lastTextBoxStyle">
  12. <item name="android:background">@color/c_black</item>
  13. <item name="android:textColor">@color/c_dark_grey</item>
  14. <item name="android:layout_width">0dp</item>
  15. <item name="android:layout_height">0dp</item>
  16. </style>
  17. <!--文本框-->
  18. <style name="editTextBoxStyle">
  19. <item name="android:textStyle">bold</item>
  20. <item name="android:background">@color/c_black</item>
  21. <item name="android:textColor">@color/c_light_grey</item>
  22. <item name="android:layout_width">0dp</item>
  23. <item name="android:layout_height">0dp</item>
  24. </style>
  25. <!--数字按钮,数字按钮的颜色
  26. 黑背景,白文字-->
  27. <style name="digitButtonStyle">
  28. <item name="android:background">@drawable/blackbutton</item>
  29. <item name="android:textColor">@color/c_white</item>
  30. <item name="android:layout_width">0dp</item>
  31. <item name="android:layout_height">0dp</item>
  32. </style>
  33. <!--普通按钮,普通功能的颜色
  34. 黑背景,灰文字-->
  35. <style name="normalButtonStyle">
  36. <item name="android:background">@drawable/blackbutton</item>
  37. <item name="android:textColor">@color/c_grey</item>
  38. <item name="android:layout_width">0dp</item>
  39. <item name="android:layout_height">0dp</item>
  40. </style>
  41. <!--特殊按钮,常用功能的颜色
  42. 黑背景,蓝色文字-->
  43. <style name="specialButtonsStyle">
  44. <item name="android:background">@drawable/blackbutton</item>
  45. <item name="android:textColor">@color/c_blue</item>
  46. <item name="android:layout_width">0dp</item>
  47. <item name="android:layout_height">0dp</item>
  48. </style>
  49. <!--删除按钮,CE和C的颜色
  50. 橙色背景,白色文字-->
  51. <style name="deleteButtonStyle">
  52. <item name="android:background">@drawable/orangebuttons</item>
  53. <item name="android:textColor">@color/c_white</item>
  54. <item name="android:layout_width">0dp</item>
  55. <item name="android:layout_height">0dp</item>
  56. </style>
  57. <!--等于按钮,蓝色背景,白色文字-->
  58. <style name="equaltoButtonStyle">
  59. <item name="android:background">@drawable/bluebuttons</item>
  60. <item name="android:textColor">@color/c_white</item>
  61. <item name="android:layout_width">0dp</item>
  62. <item name="android:layout_height">0dp</item>
  63. </style>
  64. </resources>
themes.xml

我这设置的两个都一样的,改了一下主题,就是第一个parent后面的东西。其实就是默认style继承的东西。其他的自动生成没动

  1. <resources xmlns:tools="http://schemas.android.com/tools">
  2. <!-- Base application theme. -->
  3. <style name="Base.Theme.Calculatorddaa" parent="Theme.MaterialComponents.NoActionBar.Bridge">
  4. <!-- Customize your light theme here. -->
  5. <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
  6. </style>
  7. <style name="Theme.Calculatorddaa" parent="Base.Theme.Calculatorddaa" >
  8. </style>
  9. </resources>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/325240?site
推荐阅读
相关标签
  

闽ICP备14008679号