來開發一個wanandroid快應用吧

codeGoogle發表於2019-02-21

wanandroid快應用截圖

來開發一個wanandroid快應用吧
來開發一個wanandroid快應用吧
來開發一個wanandroid快應用吧

快應用官網

不過快應用的語法類似於小程式,都是基於前段js來開發的。想學習小程式的可以參考
微信小程式開發<一>
微信小程式開發<二>
這個時代,作為程式設計師,我什麼要學習小程式

先吐槽下

1.因為快應用剛出來,網上沒有教程(至少我今天在寫這個應用的時候,網上除了demo還是demo,而且demo是官網的demo)
2.官網雖然有文件,但是文件還不完善,很多地方都不知道怎麼解決,寫這個應用真的是靠自己慢慢摸索寫出來的,本來還有幾個功能,因為實在找不出解決方法放棄了(待慢慢研究)。。。

注:前幾步跟官方文件教程基本一致,可跳過。

一、環境搭建

1.安裝nodejs

nodejs可以在官網下載
快應用文件說是不要使用8.0.*版本,推薦v6.11.3 LTS
一開始以為是8以上不能用,查了下我電腦的是8.2.0,本來打算退回去的,嘗試之後發現沒有報錯可以正常使用。

2.安裝hap-toolkit
npm install -g hap-toolkit

複製程式碼

這一步如果卡住了(我就是這樣),可以ctrl+c終止,然後輸入以下命令設定淘寶映象,之後再安裝

npm config set registry https://registry.npm.taobao.org

複製程式碼

安裝完成輸入命令

hap -V

複製程式碼

正確輸出版本資訊說明安裝成功。

二、初始化專案

1.執行以下命令初始化專案
hap init <你的專案名稱>

複製程式碼

命令執行後會在當前目錄下生成名為 你的專案名稱 的資料夾,作為專案根目錄,目錄結構如下:

├── node_modules
├── sign                      rpk包簽名模組
│   └── debug                 除錯環境
│       ├── certificate.pem   證書檔案
│       └── private.pem       私鑰檔案
├── src
│   ├── Common                公用的資原始檔和元件檔案
│   │   └── logo.png          manifest.json中配置的icon
│   ├── Demo                  頁面目錄
│   |   └── index.ux          頁面檔案,檔名不必與父資料夾相同
│   ├── app.ux                APP檔案(用於包括公用資源)
│   └── manifest.json         專案配置檔案(如:應用描述、介面申明、頁面路由等)
└── package.json              定義專案需要的各種模組及配置資訊,npm install根據這個配置檔案,自動下載所需的執行和開發環境

複製程式碼
2.編譯專案

先安裝依賴,在專案根目錄執行以下命令

npm install

複製程式碼

待安裝完成,使用以下命令編譯打包生成rpk包

npm run build

複製程式碼

編譯打包成功後,專案根目錄下會生成資料夾:build、dist

  • build:臨時產出,包含編譯後的頁面js,圖片等
  • dist:最終產出,包含rpk檔案。其實是將build目錄下的資源打包壓縮為一個檔案,字尾名為rpk,這個rpk檔案就是專案編譯後的最終產出

使用以下命令可自動重新編譯,

npm run watch

複製程式碼
注意:(我每次都遇到這個問題)

如果報錯遇到Cannot find module …/webpack.config.js,請重新執行一次hap update –force。這是由於高版本的npm在npm install時,會校驗並刪除了node_modules下部分資料夾,導致報錯。而hap update –force會重新複製hap-tools資料夾到node_modules中

三、除錯

1.安裝偵錯程式

偵錯程式是一個android應用,直接下載安裝


安裝完開啟如圖所示,此時按鈕都不能點選,還需要再安裝平臺預覽版
兩個應用安裝完就可以安裝快應用了

2.安裝執行rpk包

有兩種方式:

  • HTTP請求:開發者啟動HTTP伺服器,開啟偵錯程式,點選掃碼安裝配置HTTP伺服器地址,下載rpk包,並喚起平臺執行rpk包
  • 本地安裝:開發者將rpk包拷貝到手機檔案系統,開啟偵錯程式,點選本地安裝選擇rpk包,並喚起平臺執行rpk包

推薦第一種方式,除錯比較方便。

http請求方式:
執行命令:

// 預設埠12306
npm run server

// 自定義埠,比如8080
npm run server -- --port 8080

複製程式碼

執行成功會顯示二維碼,可用偵錯程式掃描二維碼安裝,或點選偵錯程式右上角設定http伺服器地址再點選線上更新。

此時配合命令

npm run watch

複製程式碼

即可邊開發邊預覽效果

關於日誌檢視,官方文件介紹是使用Android Studio的Android Monitor輸出來檢視日誌。這裡提供另一種方法,執行以下命令

adb logcat -s JsConsole
// JsConsole是過濾資訊,因為在as看到快應用日誌輸出都有JsConsole這個標記,所以直接使用這個檢視快應用日誌,就不會被手機其他日誌干擾

複製程式碼

這樣就可以愉快地開發應用了,因為這些命令都是不能中斷(以為中斷就看不了資訊了或除錯不了了),所以需要開啟多個終端,這裡推薦用vscode+hap extension外掛開發,直接可邊開發邊檢視,不用切換螢幕等等,如圖:

四、開始開發

一開始看demo程式碼,以為是跟vue差不多,開發起來應該挺簡單的,開發過程才慢慢發現,其他它並不是真正的html+css,很多html、css程式碼都不支援,似乎它只是模擬而已,因為會把它轉為原生元件,暫時就沒能全部支援,所以開發過程還是挺難受的,動不動就報錯沒有這個屬性沒有那個屬性。
這裡通過wanandroid開發api來開發wanandroid應用
1.修改manifest.json配置資訊
{
  "package": "cn.codebear.wanandroid", //應用包名
  "name": "wanandroid", //應用名稱
  "versionName": "1.0.0", //版本名稱
  "versionCode": "1", //版本號
  "minPlatformVersion": "101", //支援的最小平臺版本號
  "icon": "/Common/Image/logo.png", //應用logo
  "features": [ //介面列表
    { "name": "system.prompt" },
    { "name": "system.router" },
    { "name": "system.shortcut" },
    { "name": "system.fetch" },
    { "name": "system.webview" },
    { "name": "system.storage" }
  ],
  "permissions": [
    { "origin": "*" }
  ],
  "config": { //系統配置資訊
    "logLevel": "debug"
  },
  "router": { //路由資訊
    "entry": "Wanandroid",
    "pages": {
      "Wanandroid": {
        "component": "index"
      },
      "Webview": {
        "component": "index"
      }
    }
  },
  "display": { //UI顯示相關配置
    "titleBar": true,
    "titleBarBackgroundColor": "#24b9ff",
    "titleBarTextColor": "#ffffff",
    "titleBarText": "首頁",
    "pages": {
    }
  }
}

複製程式碼

具體如何配置,官方文件寫的挺詳細,這裡就不多說了。

2.刪除程式碼

把專案初始化時給的demo程式碼都刪掉。

3.建立wanandroid頁面

在src目錄下新建一個Wanandroid目錄,目錄下新建一個index.ux檔案,命名不一定要index。這個作為應用的主頁面。
程式碼如下

<template>
    <div class="wanandroid-page">
      <div class="flexible-tabs">
        <tabs onchange="changeTabactive" index="{{currentIndex}}">
          <tab-content class="flexible-tab-content">
            <div class="tab-content-section">
              <home></home>
            </div>
            <div class="tab-content-section">
              <classify></classify>
            </div>
          </tab-content>
        </tabs>
        <div class="flexible-tabbar">
          <div for="{{(index, item) in tabItems}}" class="tab-item" onclick="clickTabBar(index)">
            <image class="tab-icon" src="{{item.icon[currentIndex === index ? 1 : 0]}}"></image>
            <text class="{{currentIndex === index ? `active` : `tab-text`}}">{{item.text}}</text>
          </div>
        </div>
      </div>
    </div>
  </template>

  <import name="home" src="../Home/index"></import>
  <import name="classify" src="../Classify/index"></import>

    <script>
    import router from `@system.router`

    export default {
      data() {
        return {
          currentIndex: 0,
          tabItems: [
            {
              text: `首頁`,
              icon: [`../Common/Image/icon_home.png`, `../Common/Image/icon_home_select.png`]
            },
            {
              text: `體系`,
              icon: [`../Common/Image/icon_classify.png`, `../Common/Image/icon_classify_select.png`]
            }
          ]
        }
      },
      changeTabactive (evt) {
        this.changeCurrent(evt.index)
      },
      clickTabBar (index) {
        this.changeCurrent(index)
      },
      changeCurrent(index) {
        this.$page.setTitleBar({ text: this.tabItems[index].text })
        this.currentIndex = index
      }
    }
  </script>

複製程式碼

使用了tabs元件,本來是tab和tab-content配合使用的,發現用tab,點選一直會出現卡頓的現象,就改為tab用div實現。這個頁面比較簡單,就是一個底部tabs按鈕和一個content顯示內容,分別為home元件和classify元件。

4.home元件

home元件顯示首頁內容,包括頂部的banner和底部的文章列表。
整個頁面用list包裹,使其可以上下滑動,比較喜歡的一點是可以很方便設定header和footer。
list的item從上往下分別為banner、標題、文章列表、footer(載入更多提示)

banner使用官方的容器元件swiper來輪播展示,程式碼如下

<list-item type="banner">
    <swiper class="banner" autoplay="true" interval="4000">
        <stack class="banner" for="{{bannerlist}}">
            <image class="banner-image" src="{{$item.imagePath}}" onclick="openArticle($item.url, ``, $item.title)"></image>
            <text class="banner-title">{{$item.title}}</text>
        </stack>
    </swiper>
</list-item>

複製程式碼

文章使用for遍歷顯示


        <!-- 文章 -->
        <block for="articleList">
          <list-item type="article" class="article-item" onclick="openArticle($item.link, $item.projectLink, $item.title)">
            <div>
              <text class="tag" show="{{$item.fresh}}">新</text>
              <text class="text-title">{{$item.title}}</text>
            </div>
            <div class="article-tip">
                <text class="tip">分類: {{$item.superChapterName}}/{{$item.chapterName}}</text>
            </div>
            <div class="article-tip">
              <text class="tip">作者: {{$item.author}}</text>
              <text class="time">{{$item.niceDate}}</text>
            </div>
          </list-item>
        </block>

複製程式碼

底部載入更多

 <!-- 載入更多,type屬性自定義命名為loadMore -->
        <list-item type="loadMore" class="load-more">
          <progress type="circular" show="{{hasMoreData}}"></progress>
          <text show="{{hasMoreData}}">載入更多</text>
          <text show="{{!hasMoreData}}">沒有更多了~</text>
        </list-item>

複製程式碼

關於list的用法,直接檢視官方文件即可,很詳細list教程

swiper的用法,直接使用,裡面使用for迴圈顯示圖片等,設定autoplay為true,即可實現自動播放,這裡貌似有一個坑,需要設定swiper的高度,否則高度似乎是0,不會隨著裡面的圖片大小變化的,也可能是我寫程式碼姿勢不對。。。說到這裡,要說一下text元件,在有些地方要給它設定一個合適的高度,不然會上下被裁剪。。。

5.classify元件

這個元件顯示的是類別和對應的文章列表,其實就是三個list,具體看程式碼,挺簡單的。

6.webview頁面

還有一個頁面就是顯示webview,因為wanandroid沒有介面返回文章內容,只有文章連結,所以需要用webview開啟,直接使用官方提供的web元件,使用非常簡單

<web src="{{ url }}" id="web"></web>

複製程式碼

記得在manifest.json中宣告介面{ “name”: “system.webview” },否則會提示缺乏許可權。

7.關於網路請求

在manifest.json中宣告介面{“name”: “system.fetch”}
程式碼中使用,這裡給出獲取banner的程式碼,其他可在專案中檢視

<script>
  import fetch from `@system.fetch`
  ...
  getBanner() {
      fetch.fetch({
        url:"http://www.wanandroid.com/banner/json",
        success:function(data){
          this.bannerlist = JSON.parse(data.data).data;
        }.bind(this),
        fail: function(data, code) {
          console.log("handling fail, code=" + code);
        }
      })
    }
   ...

複製程式碼

今天就自己摸索著寫了這麼多程式碼。
專案地址:github.com/CB-ysx/wana…

五、總結

開發這個應用,感覺還是挺方便的,挺快的(無論是啟動還是開發),但是目前文件還不夠完善,網上教程也幾乎沒有,自己摸索還是挺累的,很多元件都還不怎麼會用,比如refresh都還不知道如何關閉重新整理狀態。
總而言之,對於學前端的人(雖然我是android開發仔)來說,學習成本不會很高,有空就學學新東西,反正學的是自己的,技多不壓身。

作者:Codebearsh
連結:https://www.jianshu.com/p/aca382e40b17
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

更多文章

2017上半年技術文章集合—184篇文章分類彙總

NDK專案實戰—高仿360手機助手之解除安裝監聽

破解Android版微信跳一跳,一招教你挑戰高分

高階UI特效仿直播點贊效果—一個優美炫酷的點贊動畫

一個實現錄音和播放的小案例

相信自己,沒有做不到的,只有想不到的

如果你覺得此文對您有所幫助,歡迎入群 QQ交流群 :644196190
微信公眾號:終端研發部

技術+職場

相關文章