使用 Angular Ionic 创建移动应用程序
一. 引言
在本文中,我们将学习如何使用Ionic框架创建移动应用程序。Ionic是一个开源用户界面工具,允许我们使用HTML、CSS和JavaScript构建高质量的移动应用程序,并与流行的框架(如Angular、React和Vue)集成。它支持Android和iOS平台。
在之前的文章中,我介绍了使用Electron框架开发桌面应用程序的相关内容,您可以通过以下链接查看:创建Angular Electron框架的桌面应用程序
二. 前提条件
开始使用Ionic框架的唯一要求是设置Node和npm环境,以及安装Android Studio、命令行界面和Visual Studio Code作为代码编辑器。
三. 安装Ionic
第一步是安装Ionic工具。运行以下命令以安装Ionic CLI:
npm install -g @ionic/cli native-run cordova-res
-
native-run
: 用于在设备和模拟器/仿真器上运行本机二进制文件。 -
cordova-res
: 用于为原生应用生成图标和启动画面。
四. 创建应用程序
运行以下命令以创建一个Ionic应用程序。为了方便说明,我们将创建一个计算器应用程序。以下是命令执行的屏幕截图。
ionic start calculator
五. 编写应用程序代码
1. home.page.html
以下是计算器的HTML代码:
<ion-header [translucent]="true">
<ion-toolbar>
<ion-title>
Calculator
</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]="true">
<ion-header collapse="condense">
<ion-toolbar>
<ion-title size="large">Blank</ion-title>
</ion-toolbar>
</ion-header>
<div id="container">
<div class="jumbotron col-sm-4 p-2 m-0 bg-inverse mx-auto" style="border: 1px solid lightgray; border-radius: 2%;">
<label style="font-weight: bolder;">Input</label>
<div class="input-group input-group-sm col-sm-12 m-0 p-0">
<div class="col-sm-12 form-control text-lg-right" type="text">{{input}}</div>
</div>
<label style="font-weight: bolder;">Result</label>
<div class="input-group input-group-sm col-sm-12 m-0 p-0">
<div class="form-control text-sm-right" type="text">{{result}}</div>
</div>
<div class="col-sm-12 p-1 m-0">
<button class="btn btn-info col-sm-6" type="button" (click)="allClear()">C</button>
<button class="btn btn-warning col-sm-3" type="button" (click)="clear()">x</button>
<button class="btn btn-secondary col-sm-3" type="button" (click)="pressOperator('/')">/</button>
</div>
<div class="col-sm-12 p-1 m-0">
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('7')">7</button>
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('8')">8</button>
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('9')">9</button>
<button class="btn btn-secondary col-sm-3 p-1" type="button" (click)="pressOperator('*')">X</button>
</div>
<div class="col-sm-12 p-1 m-0">
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('4')">4</button>
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('5')">5</button>
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('6')">6</button>
<button class="btn btn-secondary col-sm-3 p-1" type="button" (click)="pressOperator('-')">-</button>
</div>
<div class="col-sm-12 p-1 m-0">
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('1')">1</button>
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('2')">2</button>
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('3')">3</button>
<button class="btn btn-secondary col-sm-3 p-1" type="button" (click)="pressOperator('+')">+</button>
</div>
<div class="col-sm-12 p-1 m-0">
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('.')">.</button>
<button class="btn btn-outline-secondary col-sm-3 p-1" type="button" (click)="clickNum('0')">0</button>
<button class="btn btn-success col-sm-6 p-1" type="button" (click)="getAnswer()">=</button>
</div>
</div>
</div>
</ion-content>
2. home.page.ts
以下是计算器的TypeScript代码:
import { Component } from '@angular/core';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage {
input: string = ''; // 输入值初始化为空字符串
result: string = ''; // 结果初始化为空字符串
clickNum(num: string) {
// 不允许小数点出现超过一次
if (num == ".") {
if (this.input != "") {
const lastNum = this.getLastOperand(); // 获取最后一个操作数
if (lastNum.lastIndexOf(".") >= 0) return; // 如果最后一个操作数中已存在小数点,则返回
}
}
// 不允许输入以0开头的数字
if (num == "0") {
if (this.input == "") {
return; // 输入为空时,返回
}
const PrevKey = this.input[this.input.length - 1]; // 获取输入的最后一个字符
if (PrevKey === '/' || PrevKey === '*' || PrevKey === '-' || PrevKey === '+') {
return; // 如果最后一个字符是运算符,返回
}
}
this.input = this.input + num; // 将输入的数字添加到输入值中
this.calcAnswer(); // 计算结果
}
getLastOperand() {
let pos: number;
pos = this.input.toString().lastIndexOf("+"); // 查找最后一个加号的位置
if (this.input.toString().lastIndexOf("-") > pos) pos = this.input.lastIndexOf("-"); // 查找最后一个减号的位置
if (this.input.toString().lastIndexOf("*") > pos) pos = this.input.lastIndexOf("*"); // 查找最后一个乘号的位置
if (this.input.toString().lastIndexOf("/") > pos) pos = this.input.lastIndexOf("/"); // 查找最后一个除号的位置
return this.input.substr(pos + 1); // 返回最后一个操作数
}
pressOperator(op: string) {
// 不允许连续输入运算符
const lastKey = this.input[this.input.length - 1];
if (lastKey === '/' || lastKey === '*' || lastKey === '-' || lastKey === '+') {
return; // 如果最后一个字符是运算符,返回
}
this.input = this.input + op; // 将运算符添加到输入值中
this.calcAnswer(); // 计算结果
}
clear() {
// 清除最后一位输入
if (this.input != "") {
this.input = this.input.substr(0, this.input.length - 1);
}
}
allClear() {
this.result = ''; // 清空结果
this.input = ''; // 清空输入
}
calcAnswer() {
let formula = this.input; // 获取当前输入的表达式
let lastKey = formula[formula.length - 1]; // 获取最后一个字符
if (lastKey === '.') {
formula = formula.substr(0, formula.length - 1); // 如果最后一个字符是小数点,移除它
}
lastKey = formula[formula.length - 1]; // 更新最后一个字符
// 如果最后一个字符是运算
符,移除它
if (lastKey === '/' || lastKey === '*' || lastKey === '-' || lastKey === '+' || lastKey === '.') {
formula = formula.substr(0, formula.length - 1);
}
this.result = eval(formula); // 使用eval计算表达式
}
getAnswer() {
this.calcAnswer(); // 计算结果
this.input = this.result; // 将结果赋值给输入
if (this.input == "0") this.input = ""; // 如果结果是0,则输入为空
}
}
3. home.page.scss
以下是样式代码:
#container {
text-align: center; // 居中对齐
position: absolute; // 绝对定位
left: 0;
right: 0;
top: 50%; // 垂直居中
transform: translateY(-50%); // 使容器上下居中
}
#container strong {
font-size: 20px; // 设置字体大小
line-height: 26px; // 设置行高
}
#container p {
font-size: 16px; // 设置字体大小
line-height: 22px; // 设置行高
color: #8c8c8c; // 设置文本颜色
margin: 0; // 清除外边距
}
.col-sm-3 {
flex: 0 0 auto; // 自适应宽度
width: 23%; // 设置宽度
margin: 1%; // 设置外边距
}
@media (min-width: 576px) {
.col-sm-3 {
flex: 0 0 auto; // 自适应宽度
width: 23%; // 设置宽度
margin: 1%; // 设置外边距
}
}
.form-control {
min-height: 30px; // 设置最小高度
}
六. 添加所需的包
根据需要,我们可以添加第三方包。为使UI更流畅,这里我们使用了Bootstrap。运行以下命令以安装Bootstrap。
首先进入应用程序路径:
cd calculator
然后安装Bootstrap和Bootstrap图标:
npm i bootstrap bootstrap-icons
ng add @ng-bootstrap/ng-bootstrap
七. 在浏览器中运行应用程序
运行以下命令以在浏览器中执行应用程序:
ionic serve
启动后,您可以查看文件夹结构并检查生成的www文件夹。该文件夹包含所有生成的JavaScript代码,与Angular应用中的dist文件夹相似。
八. 安装Android SDK
一旦应用程序在浏览器中运行正常,我们现在需要在移动设备(如iOS或Android)上运行相同的应用程序。在本文示例中,我将使用Android设备,因此我要生成.apk文件。
首先,运行以下命令以生成APK文件:
ionic capacitor build android
如果Android Studio已安装,将显示如下响应,否则您需要安装Android Studio。
可以从以下链接下载Android Studio:Android Studio下载
九. 构建APK
完成Android Studio的设置后,我们可以构建APK文件。打开Android Studio,依次选择“Build” -> “Build App Bundle(s) / APK(s)” -> “Build APK(s)”。
构建过程中会显示状态更新。
构建完成后,您可以点击“Locate”查看APK文件。
十. 在Android设备上安装APK
将APK文件安装到Android设备上,您可以运行计算器应用程序并验证其功能。
十一. 结论
在本文中,我们学习了Ionic框架的使用,可以利用它创建Angular应用的移动版本。Ionic支持跨平台开发,您可以从Angular应用的源代码创建Android或iOS应用。我们可以在Web、桌面和移动应用之间共享核心逻辑,如服务和API调用,同时为每个平台生成相应的UI组件。