目录
标准计算器主要实现基本数字的四则运算(加、减、乘、除)以及简单的科学计算(幂运算)。
例:
根据上图,我们可以看到标准计算器的界面主要包含两大区域,分别是结果显示区以及功能按钮区。
01 结果显示区
我们尝试使用功能按钮区中的部分功能,在结果显示区域中获得了下图结果。
经过分析,在结果显示区中我们必须有以下几个元素:
-
在还未使用四则运算时,结果显示区中的计算结果元素显示用户输入内容;
-
当输入四则运算符时,将输入的数字与运算符转换为字符串显示在计算结果元素上方,此时若重新修改四则运算符,字符串会自动修改其中的四则运算符,直至用户再次输入数字,计算结果元素位置重新显示用户第二次输入的数字;
-
当输入等号时,字符串显示为等式,且计算结果元素显示计算结果。
02 功能按钮区
功能按钮区由24个按钮组成(MC、MR等功能本教程不涉及),并在按钮正中间显示功能符号。
注意:当用户按下按钮时,其颜色也会发生改变。
03 使用P5JS绘制界面
(1)在文档内使用P5JS组件,如果还不会创建P5JS组件,可以参考Hello World。
(2)创建画布,并指定画布颜色;
function setup() {
// 创建一个画布,大小为:320*540
createCanvas(320, 540);
}
function draw() {
// 指定背景颜色
background(150);
}
new p5();
(3)先给计算器起个名称,并显示在画面中吧;
function setup() {
// 创建一个画布,大小为:320*540
createCanvas(320, 540);
}
function draw() {
// 指定背景颜色
background(150);
// 定义标题颜色
fill(240);
// 设置对齐方式:居中,在使用文字绘图工具时,提供的坐标为文字的中心
textAlign(CENTER, CENTER);
// 设置字体大小
textSize(18);
// 在(width/2, 20)坐标上显示文字,width是P5JS的关键词,表示画布宽度
text('标准计算器 - P5学院', width/2, 20);
}
new p5();
(4)绘制功能按钮区
function setup() {
// 创建一个画布,大小为:320*540
createCanvas(320, 540);
}
function draw() {
// 指定背景颜色
background(150);
// 1. 绘制标题
this.drawAppName('标准计算器 - P5学院');
// 2. 绘制功能按钮区
this.drawFuncBtn();
}
function drawFuncBtn() {
// 由于功能按钮布局较为规律,因此可以使用嵌套循环进行绘制
for(var i = 0; i < 6; i++) { // 行元素
for(var j = 0; j < 4; j++) { // 列元素
stroke(150);
fill(200);
// 绘制方块,rect(x, y, w, h),参数分别为矩形左上角定位坐标以及矩形的宽和高
// 由于矩形定位坐标和列元素相关,因此可以使用如下算法计算按钮大小及位置
var btnWidth = (width-25)/4; // 25为按钮横向间隔总和
var btnHeight = (height-220-35)/6; // 220为显示区域,35为按钮纵向间隔总和
var posX =5+ j*btnWidth+j*5; // 第一个5是按钮最左侧的间隔,5+j*5是从第二列开始左侧的间隔总和
var posY = 5+220+i*5+i*btnHeight; // 第一个5是按钮除顶部留出220空间的第一段间隔,5+i*5同理
rect(posX, posY, btnWidth, btnHeight);
}
}
}
function drawAppName(name) {
// 定义标题颜色
fill(240);
// 设置对齐方式:居中,在使用文字绘图工具时,提供的坐标为文字的中心
textAlign(CENTER, CENTER);
// 设置字体大小
textSize(18);
// 在(width/2, 20)坐标上显示文字,width是P5JS的关键词,表示画布宽度
text(name, width/2, 20);
}
new p5();
(5)功能按钮中间添加功能符号
var btnTextList = [
'%', 'CE', 'C', 'Back', '1/x', 'x^2', 'sqrt', '/', '7', '8', '9', 'x', '4', '5', '6', '-', '1', '2', '3', '+', '+/-', '0', '.', '='
];
function setup() {
// 创建一个画布,大小为:320*540
createCanvas(320, 540);
}
function draw() {
// 指定背景颜色
background(150);
// 1. 绘制标题
this.drawAppName('标准计算器 - P5学院');
// 2. 绘制功能按钮区
this.drawFuncBtn();
}
function drawFuncBtn() {
// 由于功能按钮布局较为规律,因此可以使用嵌套循环进行绘制
for(var i = 0; i < 6; i++) { // 行元素
for(var j = 0; j < 4; j++) { // 列元素
// 在数组中获取指定符号
var btnText = btnTextList[j+i*4];
stroke(150);
fill(200);
// 绘制方块,rect(x, y, w, h),参数分别为矩形左上角定位坐标以及矩形的宽和高
// 由于矩形定位坐标和列元素相关,因此可以使用如下算法计算按钮大小及位置
var btnWidth = (width-25)/4; // 25为按钮横向间隔总和
var btnHeight = (height-220-35)/6; // 220为显示区域,35为按钮纵向间隔总和
var posX =5+ j*btnWidth+j*5; // 第一个5是按钮最左侧的间隔,5+j*5是从第二列开始左侧的间隔总和
var posY = 5+220+i*5+i*btnHeight; // 第一个5是按钮除顶部留出220空间的第一段间隔,5+i*5同理
rect(posX, posY, btnWidth, btnHeight);
// 绘制完按钮后,添加按钮功能符号
textAlign(CENTER, CENTER);
textSize(18);
noStroke();
fill(60);
text(btnText, posX+btnWidth/2, posY+btnHeight/2);
}
}
}
function drawAppName(name) {
// 定义标题颜色
fill(240);
// 设置对齐方式:居中,在使用文字绘图工具时,提供的坐标为文字的中心
textAlign(CENTER, CENTER);
// 设置字体大小
textSize(18);
// 在(width/2, 20)坐标上显示文字,width是P5JS的关键词,表示画布宽度
text(name, width/2, 20);
}
new p5();
(6)绘制结果显示区
var btnTextList = [
'%', 'CE', 'C', 'Back', '1/x', 'x^2', 'sqrt', '/', '7', '8', '9', 'x', '4', '5', '6', '-', '1', '2', '3', '+', '+/-', '0', '.', '='
];
function setup() {
// 创建一个画布,大小为:320*540
createCanvas(320, 540);
}
function draw() {
// 指定背景颜色
background(150);
// 1. 绘制标题
this.drawAppName('标准计算器 - P5学院');
// 2. 绘制功能按钮区
this.drawFuncBtn();
// 3. 绘制结果显示区
this.drawScreen();
}
function drawScreen() {
// 绘制屏幕
fill(200);
rect(5, 40, width-10, 140);
// 添加计算结果
textAlign(RIGHT);
textSize(18);
fill(50);
text('0', width-15, 150);
// 添加等式字符串
textSize(16);
fill(100);
text('0', width-15, 110);
}
function drawFuncBtn() {
// 由于功能按钮布局较为规律,因此可以使用嵌套循环进行绘制
for(var i = 0; i < 6; i++) { // 行元素
for(var j = 0; j < 4; j++) { // 列元素
// 在数组中获取指定符号
var btnText = btnTextList[j+i*4];
stroke(150);
fill(200);
// 绘制方块,rect(x, y, w, h),参数分别为矩形左上角定位坐标以及矩形的宽和高
// 由于矩形定位坐标和列元素相关,因此可以使用如下算法计算按钮大小及位置
var btnWidth = (width-25)/4; // 25为按钮横向间隔总和
var btnHeight = (height-220-35)/6; // 220为显示区域,35为按钮纵向间隔总和
var posX =5+ j*btnWidth+j*5; // 第一个5是按钮最左侧的间隔,5+j*5是从第二列开始左侧的间隔总和
var posY = 5+220+i*5+i*btnHeight; // 第一个5是按钮除顶部留出220空间的第一段间隔,5+i*5同理
rect(posX, posY, btnWidth, btnHeight);
// 绘制完按钮后,添加按钮功能符号
textAlign(CENTER, CENTER);
textSize(18);
noStroke();
fill(60);
text(btnText, posX+btnWidth/2, posY+btnHeight/2);
}
}
}
function drawAppName(name) {
// 定义标题颜色
fill(240);
// 设置对齐方式:居中,在使用文字绘图工具时,提供的坐标为文字的中心
textAlign(CENTER, CENTER);
// 设置字体大小
textSize(18);
// 在(width/2, 20)坐标上显示文字,width是P5JS的关键词,表示画布宽度
text(name, width/2, 20);
}
new p5();