使用 Angular Ionic 创建移动应用程序

发布:2024-09-26 10:53 阅读:126 点赞:0

一. 引言

在本文中,我们将学习如何使用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(".") >= 0return// 如果最后一个操作数中已存在小数点,则返回
      }
    }

    // 不允许输入以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(0this.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组件。