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


    目录

    前言

    运行结果:

    运行截屏(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 input_Double = new ArrayList<>(); // 储存用户输入的数字,用可变数组储存
    39. ArrayList input_String = new ArrayList<>(); // 储存用户输入的运算符,用可变数组储存
    40. ArrayList input_Boolean = new ArrayList<>(); // 储存用户输入是否是数字,用可变数组储存,
    41. //直接入栈的字符串
    42. ArrayList special_symbols = new ArrayList();
    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 numStack = new Stack<>();//数字栈
    637. Stack 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) savedInstanceState.getSerializable("input_Double");
    837. input_String = (ArrayList) savedInstanceState.getSerializable("input_String");
    838. input_Boolean = (ArrayList) 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. "1.0" encoding="utf-8"?>
    2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
    3. <item android:state_pressed="true">
    4. <shape android:shape="rectangle">
    5. <corners android:radius="50dp">corners>
    6. <solid android:color="@color/c_light_background" >solid>
    7. <stroke android:width="1dp"
    8. android:color="@color/c_light_button">stroke>
    9. shape>
    10. item>
    11. <item android:state_pressed="false">
    12. <shape android:shape="rectangle">
    13. <corners android:radius="50dp">corners>
    14. <solid android:color="@color/c_light_button" >solid>
    15. <stroke android:width="1dp"
    16. android:color="@color/c_light_button">stroke>
    17. shape>
    18. item>
    19. selector>

    bluebuttons.xml

    1. "1.0" encoding="utf-8"?>
    2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
    3. <item android:state_pressed="true">
    4. <shape android:shape="rectangle">
    5. <corners android:radius="50dp">corners>
    6. <solid android:color="@color/c_blue_" >solid>
    7. <stroke android:width="1dp"
    8. android:color="@color/c_dark_grey">stroke>
    9. shape>
    10. item>
    11. <item android:state_pressed="false">
    12. <shape android:shape="rectangle">
    13. <corners android:radius="50dp">corners>
    14. <solid android:color="@color/c_blue" >solid>
    15. <stroke android:width="1dp"
    16. android:color="@color/c_dark_grey">stroke>
    17. shape>
    18. item>
    19. selector>

    greybutton.xml

    1. "1.0" encoding="utf-8"?>
    2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
    3. <item android:state_pressed="true">
    4. <shape android:shape="rectangle">
    5. <corners android:radius="50dp">corners>
    6. <solid android:color="@color/c_dark_grey" >solid>
    7. <stroke android:width="1dp"
    8. android:color="@color/c_dark_grey">stroke>
    9. shape>
    10. item>
    11. <item android:state_pressed="false">
    12. <shape android:shape="rectangle">
    13. <corners android:radius="50dp">corners>
    14. <solid android:color="@color/c_grey" >solid>
    15. <stroke android:width="1dp"
    16. android:color="@color/c_dark_grey">stroke>
    17. shape>
    18. item>
    19. selector>

    orangebuttons.xml

    1. "1.0" encoding="utf-8"?>
    2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
    3. <item android:state_pressed="true">
    4. <shape android:shape="rectangle">
    5. <corners android:radius="50dp">corners>
    6. <solid android:color="@color/c_orange_" >solid>
    7. <stroke android:width="1dp"
    8. android:color="@color/c_dark_grey">stroke>
    9. shape>
    10. item>
    11. <item android:state_pressed="false">
    12. <shape android:shape="rectangle">
    13. <corners android:radius="50dp">corners>
    14. <solid android:color="@color/c_orange" >solid>
    15. <stroke android:width="1dp"
    16. android:color="@color/c_dark_grey">stroke>
    17. shape>
    18. item>
    19. selector>

    whitebutton.xml

    1. "1.0" encoding="utf-8"?>
    2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
    3. <item android:state_pressed="true">
    4. <shape android:shape="rectangle">
    5. <corners android:radius="50dp">corners>
    6. <solid android:color="@color/c_grey">solid>
    7. <stroke android:width="1dp" android:color="@color/c_dark_grey">stroke>
    8. shape>
    9. item>
    10. <item android:state_pressed="false">
    11. <shape android:shape="rectangle">
    12. <corners android:radius="50dp">corners>
    13. <solid android:color="@color/c_white">solid>
    14. <stroke android:width="1dp" android:color="@color/c_dark_grey">stroke>
    15. shape>
    16. item>
    17. selector>

    layout

    布局文件

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

     竖屏:

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

    1. "1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. style="@style/layoutStyle"
    6. android:layout_width="match_parent"
    7. android:layout_height="match_parent"
    8. tools:context=".MainActivity">
    9. <TextView
    10. android:id="@+id/textView_M"
    11. style="@style/lastTextBoxStyle"
    12. android:text="@string/M"
    13. app:layout_constraintBottom_toTopOf="@+id/horizonLayout_Last"
    14. app:layout_constraintHeight_percent="0.05"
    15. app:layout_constraintStart_toStartOf="parent"
    16. app:layout_constraintTop_toTopOf="parent"
    17. app:layout_constraintWidth_percent="0.1" />
    18. <ImageButton
    19. style="@style/lastTextBoxStyle"
    20. app:layout_constraintBottom_toTopOf="@+id/horizonLayout_Last"
    21. app:layout_constraintEnd_toStartOf="@+id/button_rotate"
    22. app:layout_constraintStart_toEndOf="@+id/textView_M"
    23. app:layout_constraintTop_toTopOf="parent" />
    24. <Button
    25. android:id="@+id/button_rotate"
    26. style="@style/lastTextBoxStyle"
    27. android:text="@string/rotate"
    28. app:layout_constraintBottom_toTopOf="@+id/horizonLayout_Last"
    29. app:layout_constraintEnd_toEndOf="parent"
    30. app:layout_constraintHeight_percent="0.05"
    31. app:layout_constraintTop_toTopOf="parent"
    32. app:layout_constraintWidth_percent="0.1" />
    33. <HorizontalScrollView
    34. android:id="@+id/horizonLayout_Last"
    35. style="@style/lastTextBoxStyle"
    36. android:layout_width="match_parent"
    37. android:scrollbars="vertical"
    38. app:layout_constraintEnd_toEndOf="parent"
    39. app:layout_constraintHeight_percent="0.08"
    40. app:layout_constraintStart_toStartOf="parent"
    41. app:layout_constraintTop_toBottomOf="@+id/button_rotate"
    42. app:layout_constraintWidth_percent="1">
    43. <TextView
    44. android:id="@+id/textView_Last"
    45. style="@style/lastTextBoxStyle"
    46. android:layout_width="wrap_content"
    47. android:layout_height="match_parent"
    48. android:layout_gravity="end"
    49. android:gravity="end"
    50. android:maxLines="1"
    51. android:scrollbars="vertical"
    52. android:text=""
    53. android:textSize="24sp"
    54. app:layout_constraintEnd_toEndOf="parent"
    55. app:layout_constraintStart_toStartOf="parent" />
    56. HorizontalScrollView>
    57. <EditText
    58. android:id="@+id/textView_Equation"
    59. style="@style/editTextBoxStyle"
    60. android:focusableInTouchMode="false"
    61. android:gravity="right"
    62. android:marqueeRepeatLimit="marquee_forever"
    63. android:singleLine="true"
    64. android:text=""
    65. android:textSize="50sp"
    66. app:layout_constraintEnd_toEndOf="parent"
    67. app:layout_constraintHeight_percent="0.15"
    68. app:layout_constraintHorizontal_bias="0.0"
    69. app:layout_constraintStart_toStartOf="parent"
    70. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Last"
    71. app:layout_constraintWidth_percent="1" />
    72. <HorizontalScrollView
    73. android:id="@+id/horizonLayout_Now"
    74. style="@style/lastTextBoxStyle"
    75. android:scrollbars="vertical"
    76. app:layout_constraintEnd_toEndOf="parent"
    77. app:layout_constraintHeight_percent="0.08"
    78. app:layout_constraintStart_toStartOf="parent"
    79. app:layout_constraintTop_toBottomOf="@+id/textView_Equation"
    80. app:layout_constraintWidth_percent="1">
    81. <TextView
    82. android:id="@+id/textView_Now"
    83. style="@style/lastTextBoxStyle"
    84. android:layout_width="wrap_content"
    85. android:layout_height="match_parent"
    86. android:layout_gravity="end"
    87. android:gravity="end"
    88. android:maxLines="1"
    89. android:scrollbars="vertical"
    90. android:text=""
    91. android:textSize="20sp"
    92. app:layout_constraintEnd_toEndOf="parent"
    93. app:layout_constraintStart_toStartOf="parent" />
    94. HorizontalScrollView>
    95. <Button
    96. android:id="@+id/button_MR"
    97. style="@style/normalButtonStyle"
    98. android:text="@string/MR"
    99. android:textSize="25sp"
    100. app:layout_constraintBottom_toTopOf="@+id/button_C"
    101. app:layout_constraintEnd_toStartOf="@+id/button_Mup"
    102. app:layout_constraintHeight_percent="0.1"
    103. app:layout_constraintStart_toStartOf="parent"
    104. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
    105. app:layout_constraintWidth_percent="0.22" />
    106. <Button
    107. android:id="@+id/button_Mup"
    108. style="@style/normalButtonStyle"
    109. android:text="@string/Mup"
    110. android:textSize="25sp"
    111. app:layout_constraintBottom_toTopOf="@+id/button_div"
    112. app:layout_constraintEnd_toStartOf="@+id/button_Mdown"
    113. app:layout_constraintHeight_percent="0.1"
    114. app:layout_constraintStart_toEndOf="@+id/button_MR"
    115. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
    116. app:layout_constraintWidth_percent="0.22" />
    117. <Button
    118. android:id="@+id/button_Mdown"
    119. style="@style/normalButtonStyle"
    120. android:text="@string/Mdown"
    121. android:textSize="25sp"
    122. app:layout_constraintBottom_toTopOf="@+id/button_mul"
    123. app:layout_constraintEnd_toStartOf="@+id/button_MC"
    124. app:layout_constraintHeight_percent="0.1"
    125. app:layout_constraintStart_toEndOf="@+id/button_Mup"
    126. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
    127. app:layout_constraintWidth_percent="0.22" />
    128. <Button
    129. android:id="@+id/button_MC"
    130. style="@style/deleteButtonStyle"
    131. android:text="@string/MC"
    132. android:textSize="25sp"
    133. app:layout_constraintBottom_toTopOf="@+id/button_CE"
    134. app:layout_constraintEnd_toEndOf="parent"
    135. app:layout_constraintHeight_percent="0.1"
    136. app:layout_constraintStart_toEndOf="@+id/button_Mdown"
    137. app:layout_constraintTop_toBottomOf="@+id/horizonLayout_Now"
    138. app:layout_constraintWidth_percent="0.22" />
    139. <Button
    140. android:id="@+id/button_C"
    141. style="@style/specialButtonsStyle"
    142. android:text="@string/C"
    143. android:textSize="25sp"
    144. app:layout_constraintBottom_toTopOf="@+id/button_7"
    145. app:layout_constraintEnd_toStartOf="@+id/button_div"
    146. app:layout_constraintHeight_percent="0.1"
    147. app:layout_constraintStart_toStartOf="parent"
    148. app:layout_constraintTop_toBottomOf="@+id/button_MR"
    149. app:layout_constraintWidth_percent="0.22" />
    150. <Button
    151. android:id="@+id/button_div"
    152. style="@style/specialButtonsStyle"
    153. android:text="@string/div"
    154. android:textSize="25sp"
    155. app:layout_constraintBottom_toTopOf="@+id/button_8"
    156. app:layout_constraintEnd_toStartOf="@+id/button_mul"
    157. app:layout_constraintHeight_percent="0.1"
    158. app:layout_constraintStart_toEndOf="@+id/button_C"
    159. app:layout_constraintTop_toBottomOf="@+id/button_Mup"
    160. app:layout_constraintWidth_percent="0.22" />
    161. <Button
    162. android:id="@+id/button_mul"
    163. style="@style/specialButtonsStyle"
    164. android:text="@string/mul"
    165. android:textSize="25sp"
    166. app:layout_constraintBottom_toTopOf="@+id/button_8"
    167. app:layout_constraintEnd_toStartOf="@+id/button_CE"
    168. app:layout_constraintHeight_percent="0.1"
    169. app:layout_constraintStart_toEndOf="@+id/button_div"
    170. app:layout_constraintTop_toBottomOf="@+id/button_Mdown"
    171. app:layout_constraintWidth_percent="0.22" />
    172. <Button
    173. android:id="@+id/button_CE"
    174. style="@style/deleteButtonStyle"
    175. android:text="@string/CE"
    176. android:textSize="25sp"
    177. app:layout_constraintBottom_toTopOf="@+id/button_sub"
    178. app:layout_constraintEnd_toEndOf="parent"
    179. app:layout_constraintHeight_percent="0.1"
    180. app:layout_constraintStart_toEndOf="@+id/button_mul"
    181. app:layout_constraintTop_toBottomOf="@+id/button_MC"
    182. app:layout_constraintWidth_percent="0.22" />
    183. <Button
    184. android:id="@+id/button_sub"
    185. style="@style/specialButtonsStyle"
    186. android:text="@string/sub"
    187. android:textSize="25sp"
    188. app:layout_constraintBottom_toTopOf="@+id/button_add"
    189. app:layout_constraintEnd_toEndOf="parent"
    190. app:layout_constraintHeight_percent="0.1"
    191. app:layout_constraintStart_toEndOf="@+id/button_9"
    192. app:layout_constraintTop_toBottomOf="@+id/button_CE"
    193. app:layout_constraintWidth_percent="0.22" />
    194. <Button
    195. android:id="@+id/button_add"
    196. style="@style/specialButtonsStyle"
    197. android:text="@string/add"
    198. android:textSize="25sp"
    199. app:layout_constraintBottom_toTopOf="@+id/button_equal_To"
    200. app:layout_constraintEnd_toEndOf="parent"
    201. app:layout_constraintHeight_percent="0.1"
    202. app:layout_constraintStart_toEndOf="@+id/button_6"
    203. app:layout_constraintTop_toBottomOf="@+id/button_sub"
    204. app:layout_constraintWidth_percent="0.22" />
    205. <Button
    206. android:id="@+id/button_equal_To"
    207. style="@style/equaltoButtonStyle"
    208. android:text="@string/equal_To"
    209. android:textSize="25sp"
    210. app:layout_constraintBottom_toBottomOf="parent"
    211. app:layout_constraintEnd_toEndOf="parent"
    212. app:layout_constraintHeight_percent="0.21"
    213. app:layout_constraintStart_toEndOf="@+id/button_3"
    214. app:layout_constraintTop_toBottomOf="@+id/button_add"
    215. app:layout_constraintWidth_percent="0.22" />
    216. <Button
    217. android:id="@+id/button_point"
    218. style="@style/digitButtonStyle"
    219. android:text="@string/point"
    220. android:textSize="25sp"
    221. app:layout_constraintBottom_toBottomOf="parent"
    222. app:layout_constraintEnd_toStartOf="@+id/button_equal_To"
    223. app:layout_constraintHeight_percent="0.1"
    224. app:layout_constraintStart_toEndOf="@+id/button_0"
    225. app:layout_constraintTop_toBottomOf="@+id/button_3"
    226. app:layout_constraintWidth_percent="0.22" />
    227. <Button
    228. android:id="@+id/button_0"
    229. style="@style/digitButtonStyle"
    230. android:text="@string/_0"
    231. android:textSize="25sp"
    232. app:layout_constraintBottom_toBottomOf="parent"
    233. app:layout_constraintEnd_toStartOf="@+id/button_point"
    234. app:layout_constraintHeight_percent="0.1"
    235. app:layout_constraintStart_toStartOf="parent"
    236. app:layout_constraintTop_toBottomOf="@+id/button_2"
    237. app:layout_constraintWidth_percent="0.47" />
    238. <Button
    239. android:id="@+id/button_1"
    240. style="@style/digitButtonStyle"
    241. android:text="@string/_1"
    242. android:textSize="25sp"
    243. app:layout_constraintBottom_toTopOf="@+id/button_0"
    244. app:layout_constraintEnd_toStartOf="@+id/button_2"
    245. app:layout_constraintHeight_percent="0.1"
    246. app:layout_constraintStart_toStartOf="parent"
    247. app:layout_constraintTop_toBottomOf="@+id/button_4"
    248. app:layout_constraintWidth_percent="0.22" />
    249. <Button
    250. android:id="@+id/button_2"
    251. style="@style/digitButtonStyle"
    252. android:text="@string/_2"
    253. android:textSize="25sp"
    254. app:layout_constraintBottom_toTopOf="@+id/button_0"
    255. app:layout_constraintEnd_toStartOf="@+id/button_3"
    256. app:layout_constraintHeight_percent="0.1"
    257. app:layout_constraintStart_toEndOf="@+id/button_1"
    258. app:layout_constraintTop_toBottomOf="@+id/button_5"
    259. app:layout_constraintWidth_percent="0.22" />
    260. <Button
    261. android:id="@+id/button_3"
    262. style="@style/digitButtonStyle"
    263. android:text="@string/_3"
    264. android:textSize="25sp"
    265. app:layout_constraintBottom_toTopOf="@+id/button_point"
    266. app:layout_constraintEnd_toStartOf="@+id/button_equal_To"
    267. app:layout_constraintHeight_percent="0.1"
    268. app:layout_constraintStart_toEndOf="@+id/button_2"
    269. app:layout_constraintTop_toBottomOf="@+id/button_5"
    270. app:layout_constraintWidth_percent="0.22" />
    271. <Button
    272. android:id="@+id/button_4"
    273. style="@style/digitButtonStyle"
    274. android:text="@string/_4"
    275. android:textSize="25sp"
    276. app:layout_constraintBottom_toTopOf="@+id/button_1"
    277. app:layout_constraintEnd_toStartOf="@+id/button_5"
    278. app:layout_constraintHeight_percent="0.1"
    279. app:layout_constraintStart_toStartOf="parent"
    280. app:layout_constraintTop_toBottomOf="@+id/button_7"
    281. app:layout_constraintWidth_percent="0.22" />
    282. <Button
    283. android:id="@+id/button_5"
    284. style="@style/digitButtonStyle"
    285. android:text="@string/_5"
    286. android:textSize="25sp"
    287. app:layout_constraintBottom_toTopOf="@+id/button_2"
    288. app:layout_constraintEnd_toStartOf="@+id/button_6"
    289. app:layout_constraintHeight_percent="0.1"
    290. app:layout_constraintStart_toEndOf="@+id/button_4"
    291. app:layout_constraintTop_toBottomOf="@+id/button_8"
    292. app:layout_constraintWidth_percent="0.22" />
    293. <Button
    294. android:id="@+id/button_6"
    295. style="@style/digitButtonStyle"
    296. android:text="@string/_6"
    297. android:textSize="25sp"
    298. app:layout_constraintBottom_toTopOf="@+id/button_3"
    299. app:layout_constraintEnd_toStartOf="@+id/button_add"
    300. app:layout_constraintHeight_percent="0.1"
    301. app:layout_constraintStart_toEndOf="@+id/button_5"
    302. app:layout_constraintTop_toBottomOf="@+id/button_9"
    303. app:layout_constraintWidth_percent="0.22" />
    304. <Button
    305. android:id="@+id/button_7"
    306. style="@style/digitButtonStyle"
    307. android:text="@string/_7"
    308. android:textSize="25sp"
    309. app:layout_constraintBottom_toTopOf="@+id/button_4"
    310. app:layout_constraintEnd_toStartOf="@+id/button_8"
    311. app:layout_constraintHeight_percent="0.1"
    312. app:layout_constraintStart_toStartOf="parent"
    313. app:layout_constraintTop_toBottomOf="@+id/button_C"
    314. app:layout_constraintWidth_percent="0.22" />
    315. <Button
    316. android:id="@+id/button_8"
    317. style="@style/digitButtonStyle"
    318. android:text="@string/_8"
    319. android:textSize="25sp"
    320. app:layout_constraintBottom_toTopOf="@+id/button_5"
    321. app:layout_constraintEnd_toStartOf="@+id/button_9"
    322. app:layout_constraintHeight_percent="0.1"
    323. app:layout_constraintStart_toEndOf="@+id/button_7"
    324. app:layout_constraintTop_toBottomOf="@+id/button_div"
    325. app:layout_constraintWidth_percent="0.22" />
    326. <Button
    327. android:id="@+id/button_9"
    328. style="@style/digitButtonStyle"
    329. android:text="@string/_9"
    330. android:textSize="25sp"
    331. app:layout_constraintBottom_toTopOf="@+id/button_6"
    332. app:layout_constraintEnd_toStartOf="@+id/button_sub"
    333. app:layout_constraintHeight_percent="0.1"
    334. app:layout_constraintStart_toEndOf="@+id/button_8"
    335. app:layout_constraintTop_toBottomOf="@+id/button_mul"
    336. app:layout_constraintWidth_percent="0.22" />
    337. <Button
    338. android:id="@+id/button_left_parenthesis"
    339. style="@style/normalButtonStyle"
    340. android:visibility="gone" />
    341. <Button
    342. android:id="@+id/button_right_parenthesis"
    343. style="@style/normalButtonStyle"
    344. android:visibility="gone" />
    345. <Button
    346. android:id="@+id/button_reciprocal"
    347. style="@style/normalButtonStyle"
    348. android:visibility="gone" />
    349. <Button
    350. android:id="@+id/button_square"
    351. style="@style/normalButtonStyle"
    352. android:visibility="gone" />
    353. <Button
    354. android:id="@+id/button_cubic_power"
    355. style="@style/normalButtonStyle"
    356. android:visibility="gone" />
    357. <Button
    358. android:id="@+id/button_n_power"
    359. style="@style/normalButtonStyle"
    360. android:visibility="gone" />
    361. <Button
    362. android:id="@+id/button_square_root"
    363. style="@style/normalButtonStyle"
    364. android:visibility="gone" />
    365. <Button
    366. android:id="@+id/button_cube_root"
    367. style="@style/normalButtonStyle"
    368. android:visibility="gone" />
    369. <Button
    370. android:id="@+id/button_n_root"
    371. style="@style/normalButtonStyle"
    372. android:visibility="gone" />
    373. <Button
    374. android:id="@+id/button_e"
    375. style="@style/normalButtonStyle"
    376. android:visibility="gone" />
    377. <Button
    378. android:id="@+id/button_ln"
    379. style="@style/normalButtonStyle"
    380. android:visibility="gone" />
    381. <Button
    382. android:id="@+id/button_log"
    383. style="@style/normalButtonStyle"
    384. android:visibility="gone" />
    385. <Button
    386. android:id="@+id/button_sin"
    387. style="@style/normalButtonStyle"
    388. android:visibility="gone" />
    389. <Button
    390. android:id="@+id/button_cos"
    391. style="@style/normalButtonStyle"
    392. android:visibility="gone" />
    393. <Button
    394. android:id="@+id/button_tan"
    395. style="@style/normalButtonStyle"
    396. android:visibility="gone" />
    397. <Button
    398. android:id="@+id/button_idaoi"
    399. style="@style/normalButtonStyle"
    400. android:visibility="gone" />
    401. <Button
    402. android:id="@+id/button_pi"
    403. style="@style/normalButtonStyle"
    404. android:visibility="gone" />
    405. <Button
    406. android:id="@+id/button_inv"
    407. style="@style/normalButtonStyle"
    408. android:visibility="gone" />
    409. androidx.constraintlayout.widget.ConstraintLayout>

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

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

    values

            colors.xml

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

    1. "1.0" encoding="utf-8"?>
    2. <resources>
    3. <color name="black">#FF000000color>
    4. <color name="white">#FFFFFFFFcolor>
    5. <color name="c_black">#000000color>
    6. <color name="c_light_background">#303030color>
    7. <color name="c_light_button">#404040color>
    8. <color name="c_white">#FFFFFFcolor>
    9. <color name="c_blue">#506EF0color>
    10. <color name="c_blue_">#2A40C0color>
    11. <color name="c_orange">#FFBB40color>
    12. <color name="c_orange_">#FFA400color>
    13. <color name="c_light_grey">#EAEAEEcolor>
    14. <color name="c_grey">#CDCDD2color>
    15. <color name="c_dark_grey">#9696A0color>
    16. resources>
    strings.xml

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

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

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

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

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

    浅色模式

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

    1. "1.0" encoding="utf-8"?>
    2. <resources>
    3. <style name="layoutStyle">
    4. <item name="android:background">@color/c_light_greyitem>
    5. <item name="android:textColor">@color/c_dark_greyitem>
    6. <item name="android:layout_width">0dpitem>
    7. <item name="android:layout_height">0dpitem>
    8. style>
    9. <style name="lastTextBoxStyle">
    10. <item name="android:background">@color/c_whiteitem>
    11. <item name="android:textColor">@color/c_dark_greyitem>
    12. <item name="android:layout_width">0dpitem>
    13. <item name="android:layout_height">0dpitem>
    14. style>
    15. <style name="editTextBoxStyle">
    16. <item name="android:textStyle">bolditem>
    17. <item name="android:background">@color/c_whiteitem>
    18. <item name="android:textColor">@color/c_blackitem>
    19. <item name="android:layout_width">0dpitem>
    20. <item name="android:layout_height">0dpitem>
    21. style>
    22. <style name="digitButtonStyle">
    23. <item name="android:background">@drawable/whitebuttonitem>
    24. <item name="android:textColor">@color/c_blackitem>
    25. <item name="android:layout_width">0dpitem>
    26. <item name="android:layout_height">0dpitem>
    27. style>
    28. <style name="normalButtonStyle">
    29. <item name="android:background">@drawable/greybuttonitem>
    30. <item name="android:textColor">@color/c_blackitem>
    31. <item name="android:layout_width">0dpitem>
    32. <item name="android:layout_height">0dpitem>
    33. style>
    34. <style name="specialButtonsStyle">
    35. <item name="android:background">@drawable/greybuttonitem>
    36. <item name="android:textColor">@color/c_blueitem>
    37. <item name="android:layout_width">0dpitem>
    38. <item name="android:layout_height">0dpitem>
    39. style>
    40. <style name="deleteButtonStyle">
    41. <item name="android:background">@drawable/orangebuttonsitem>
    42. <item name="android:textColor">@color/c_whiteitem>
    43. <item name="android:layout_width">0dpitem>
    44. <item name="android:layout_height">0dpitem>
    45. style>
    46. <style name="equaltoButtonStyle">
    47. <item name="android:background">@drawable/bluebuttonsitem>
    48. <item name="android:textColor">@color/c_whiteitem>
    49. <item name="android:layout_width">0dpitem>
    50. <item name="android:layout_height">0dpitem>
    51. style>
    52. resources>
    深色模式
    1. "1.0" encoding="utf-8"?>
    2. <resources>
    3. <style name="layoutStyle">
    4. <item name="android:background">@color/c_light_backgrounditem>
    5. <item name="android:textColor">@color/c_greyitem>
    6. <item name="android:layout_width">0dpitem>
    7. <item name="android:layout_height">0dpitem>
    8. style>
    9. <style name="lastTextBoxStyle">
    10. <item name="android:background">@color/c_blackitem>
    11. <item name="android:textColor">@color/c_dark_greyitem>
    12. <item name="android:layout_width">0dpitem>
    13. <item name="android:layout_height">0dpitem>
    14. style>
    15. <style name="editTextBoxStyle">
    16. <item name="android:textStyle">bolditem>
    17. <item name="android:background">@color/c_blackitem>
    18. <item name="android:textColor">@color/c_light_greyitem>
    19. <item name="android:layout_width">0dpitem>
    20. <item name="android:layout_height">0dpitem>
    21. style>
    22. <style name="digitButtonStyle">
    23. <item name="android:background">@drawable/blackbuttonitem>
    24. <item name="android:textColor">@color/c_whiteitem>
    25. <item name="android:layout_width">0dpitem>
    26. <item name="android:layout_height">0dpitem>
    27. style>
    28. <style name="normalButtonStyle">
    29. <item name="android:background">@drawable/blackbuttonitem>
    30. <item name="android:textColor">@color/c_greyitem>
    31. <item name="android:layout_width">0dpitem>
    32. <item name="android:layout_height">0dpitem>
    33. style>
    34. <style name="specialButtonsStyle">
    35. <item name="android:background">@drawable/blackbuttonitem>
    36. <item name="android:textColor">@color/c_blueitem>
    37. <item name="android:layout_width">0dpitem>
    38. <item name="android:layout_height">0dpitem>
    39. style>
    40. <style name="deleteButtonStyle">
    41. <item name="android:background">@drawable/orangebuttonsitem>
    42. <item name="android:textColor">@color/c_whiteitem>
    43. <item name="android:layout_width">0dpitem>
    44. <item name="android:layout_height">0dpitem>
    45. style>
    46. <style name="equaltoButtonStyle">
    47. <item name="android:background">@drawable/bluebuttonsitem>
    48. <item name="android:textColor">@color/c_whiteitem>
    49. <item name="android:layout_width">0dpitem>
    50. <item name="android:layout_height">0dpitem>
    51. style>
    52. resources>
    themes.xml

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

    1. <resources xmlns:tools="http://schemas.android.com/tools">
    2. <style name="Base.Theme.Calculatorddaa" parent="Theme.MaterialComponents.NoActionBar.Bridge">
    3. style>
    4. <style name="Theme.Calculatorddaa" parent="Base.Theme.Calculatorddaa" >
    5. style>
    6. resources>

  • 相关阅读:
    Leetcode刷题——单链表2
    每一次只可跨1阶或2阶,爬100阶的楼梯可有多少种走法题解
    微分方程和线性代数(分离变量法开始)
    基于Nodejs的电博客管理系统的设计和实现
    前端必须了解的布局常识:普通流(normal flow)
    Part2_扩展MATSIM_Subpart13_开发过程和自己的模块_第45章 如何编写自己的扩展并可能将其贡献给Matsim
    探讨下如何更好的使用缓存 —— 集中式缓存Redis的BitMap存储、管道与事务、以及与本地缓存一起构建多级缓存
    测试开发概念篇
    区块链 | ERC721 标准
    淘宝商品详情接口,商品属性接口,商品信息查询,商品详细信息接口,h5详情,淘宝APP详情
  • 原文地址:https://blog.csdn.net/weixin_58196051/article/details/133553495