DDZZ669 发表于 2022-4-5 15:40

【平头哥Sipeed LicheeRV 86 Panel测评】12-Waft例程分析与按钮功能测试

<p cid="n0" mdtype="paragraph">LicheeRV 86 Panel开发板支持Waft的方式进行图形界面的开发,之前的两篇文章:</p>

<p cid="n211" mdtype="paragraph"><a href="https://bbs.eeworld.com.cn/thread-1193434-1-1.html" spellcheck="false"><strong>【平头哥Sipeed LicheeRV 86 Panel测评】6-Waft图形界面开发测试(上)</strong></a></p>

<p cid="n217" mdtype="paragraph"><a href="https://bbs.eeworld.com.cn/thread-1193436-1-1.html" spellcheck="false"><strong>【平头哥Sipeed LicheeRV 86 Panel测评】7-Waft图形界面开发测试(下)</strong></a></p>

<p cid="n209" mdtype="paragraph">已经介绍过waft的开发环境搭建以及的demo例程测试。本篇,来详细分析Waft的一个基础例程的代码结构,并尝试修改对应的参数验证各处代码的作用,最后再来测试一下按钮组件的显示功能。</p>

<h1 cid="n2" mdtype="heading">1 Waft文件结构</h1>

<p cid="n3" mdtype="paragraph">waft是基于<strong>AssemblyScript语言</strong>开发的前端框架,项目编译产出后缀为.wasm的bundle包,可以在web或装有waft容器的设备上,动态的跨端运行。</p>

<p cid="n4" mdtype="paragraph">waft采用<strong>渲染</strong>和<strong>逻辑</strong>分离的架构,通过定义模板视图和页面执行逻辑,两者会通过state进行数据绑定。执行逻辑通过更新state,从而触发渲染更新。</p>

<p cid="n5" mdtype="paragraph">waft应用结构类似小程序,分为app和page两层:app描述了整个应用,page描述页面。</p>

<p cid="n6" mdtype="paragraph">app由三个文件组成,必须放在项目的根目录。</p>

<figure cid="n7" mdtype="table">
<table>
        <thead>
                <tr cid="n8" mdtype="table_row">
                        <th><strong>文件</strong></th>
                        <th><strong>必填</strong></th>
                        <th><strong>作用</strong></th>
                </tr>
        </thead>
        <tbody>
                <tr cid="n12" mdtype="table_row">
                        <td>app.ts</td>
                        <td>是</td>
                        <td>脚本逻辑</td>
                </tr>
                <tr cid="n16" mdtype="table_row">
                        <td>app.json</td>
                        <td>是</td>
                        <td>全局设置</td>
                </tr>
                <tr cid="n20" mdtype="table_row">
                        <td>mock.json</td>
                        <td>?</td>
                        <td>一些变量?</td>
                </tr>
        </tbody>
</table>
</figure>

<p cid="n24" mdtype="paragraph"><code>page</code>由四个文件组成,分别是:</p>

<figure cid="n25" mdtype="table">
<table>
        <thead>
                <tr cid="n26" mdtype="table_row">
                        <th><strong>文件</strong></th>
                        <th><strong>必填</strong></th>
                        <th><strong>作用</strong></th>
                </tr>
        </thead>
        <tbody>
                <tr cid="n30" mdtype="table_row">
                        <td>index.ts</td>
                        <td>是</td>
                        <td>页面逻辑</td>
                </tr>
                <tr cid="n34" mdtype="table_row">
                        <td>index.axml</td>
                        <td>是</td>
                        <td><strong>页面结构</strong>(类比html)</td>
                </tr>
                <tr cid="n38" mdtype="table_row">
                        <td>index.acss</td>
                        <td>否</td>
                        <td><strong>页面样式表</strong>(类比css)</td>
                </tr>
                <tr cid="n42" mdtype="table_row">
                        <td>indexc.json</td>
                        <td>否</td>
                        <td>页面配置</td>
                </tr>
        </tbody>
</table>
</figure>

<p cid="n46" mdtype="paragraph">开发者所写的代码,最终都会打包成一个wasm文件,在waft容器启动时运行。</p>

<h1 cid="n47" mdtype="heading">2 模板例程分析</h1>

<p cid="n48" mdtype="paragraph">使用demo例程中的<strong>空模板例程</strong>(empty)来分析Waft的代码结构,使用VSCode打开工程代码,项目源码结构如下:</p>

<p cid="n49" mdtype="paragraph"></p>

<p cid="n50" mdtype="paragraph">下面来尝试分析一下各个文件中每行代码的含义。</p>

<h2 cid="n51" mdtype="heading">2.1 根目录</h2>

<h3 cid="n52" mdtype="heading">2.1.1 全局设置-app.json</h3>

<pre>
<code>{
 "pages": [
   "pages/index/index"
],
 "default": "pages/index/index",
 "window": {
   "defaultTitle": "Waft Empty Template"
},
 "viewport":{
   "width": 1024,
   "height": 600,
   "scaleMode": "fixedHeight"
}
}</code></pre>

<ul cid="n54" data-mark="-" mdtype="list">
        <li cid="n55" mdtype="list_item">
        <p cid="n56" mdtype="paragraph">pages数组</p>

        <ul cid="n57" data-mark="-" mdtype="list">
                <li cid="n58" mdtype="list_item">
                <p cid="n59" mdtype="paragraph">&quot;pages/index/index&quot; <strong>--指明路径为pages目录下的index目录下的index开头的相关文件</strong></p>
                </li>
        </ul>
        </li>
        <li cid="n60" mdtype="list_item">
        <p cid="n61" mdtype="paragraph">default字段:&quot;pages/index/index&quot;</p>
        </li>
        <li cid="n62" mdtype="list_item">
        <p cid="n63" mdtype="paragraph">windows对象</p>

        <ul cid="n64" data-mark="-" mdtype="list">
                <li cid="n65" mdtype="list_item">
                <p cid="n66" mdtype="paragraph">defaultTitle字段:&quot;Waft Empty Template&quot; <strong>--表示这是一个空工程</strong></p>
                </li>
        </ul>
        </li>
        <li cid="n67" mdtype="list_item">
        <p cid="n68" mdtype="paragraph">viewport对象</p>

        <ul cid="n69" data-mark="-" mdtype="list">
                <li cid="n70" mdtype="list_item">
                <p cid="n71" mdtype="paragraph">width字段:1024 <strong>--页面宽度</strong></p>
                </li>
                <li cid="n72" mdtype="list_item">
                <p cid="n73" mdtype="paragraph">height字段:600 <strong>--页面高度</strong></p>
                </li>
                <li cid="n74" mdtype="list_item">
                <p cid="n75" mdtype="paragraph">widthscaleMode字段:&quot;fixedHeight&quot;</p>
                </li>
        </ul>
        </li>
</ul>

<h3 cid="n76" mdtype="heading">2.1.2 脚本逻辑-app.ts</h3>

<pre>
<code>import { JSONObject } from "waft-json";
import { console, App } from "waft";
export class app extends App{
 onLaunch(options: JSONObject): void{
   super.onLaunch(options);
   console.log('app onLaunch');
}
}</code></pre>

<ul cid="n78" data-mark="-" mdtype="list">
        <li cid="n79" mdtype="list_item">
        <p cid="n80" mdtype="paragraph">引入<strong>JSONObject</strong>从&quot;waft-json&quot;中</p>
        </li>
        <li cid="n81" mdtype="list_item">
        <p cid="n82" mdtype="paragraph">引入<strong>console和App</strong>从&quot;waft&quot;中</p>
        </li>
        <li cid="n83" mdtype="list_item">
        <p cid="n84" mdtype="paragraph">一个app类?</p>
        </li>
</ul>

<h3 cid="n85" mdtype="heading">2.1.3 mock.json</h3>

<pre>
<code>{
 "dataSource":{
   "desc": "powered by waft",
   "percent": 42
}
}</code></pre>

<ul cid="n87" data-mark="-" mdtype="list">
        <li cid="n88" mdtype="list_item">
        <p cid="n89" mdtype="paragraph">数据源</p>

        <ul cid="n90" data-mark="-" mdtype="list">
                <li cid="n91" mdtype="list_item">
                <p cid="n92" mdtype="paragraph">变量 desc:&quot;powered by waft&quot;</p>
                </li>
                <li cid="n93" mdtype="list_item">
                <p cid="n94" mdtype="paragraph">变量 percent: 42</p>
                </li>
        </ul>
        </li>
</ul>

<h2 cid="n95" mdtype="heading">2.2 pages页面</h2>

<h3 cid="n96" mdtype="heading">2.2.1 页面样式表-index.ass</h3>

<pre>
<code>.warpper {
 background-color:white;
 width:100%;
 height:100%;
 display:flex;
 flex-direction: column;
 justify-content: center;
 align-items: center;
}

.text{
 color: black;
}</code></pre>

<ul cid="n98" data-mark="-" mdtype="list">
        <li cid="n99" mdtype="list_item">
        <p cid="n100" mdtype="paragraph">warpper 包装器</p>

        <ul cid="n101" data-mark="-" mdtype="list">
                <li cid="n102" mdtype="list_item">
                <p cid="n103" mdtype="paragraph">background-color: 背景色</p>
                </li>
                <li cid="n104" mdtype="list_item">
                <p cid="n105" mdtype="paragraph">width: 宽度</p>
                </li>
                <li cid="n106" mdtype="list_item">
                <p cid="n107" mdtype="paragraph">height: 高度</p>
                </li>
                <li cid="n108" mdtype="list_item">
                <p cid="n109" mdtype="paragraph">display: 弹性布局</p>
                </li>
                <li cid="n110" mdtype="list_item">
                <p cid="n111" mdtype="paragraph">flex-direction: 弹性方向为列方向</p>
                </li>
                <li cid="n112" mdtype="list_item">
                <p cid="n113" mdtype="paragraph">justify-direction: 用于设置弹性盒子元素在主轴方向上的对齐方式</p>
                </li>
                <li cid="n114" mdtype="list_item">
                <p cid="n115" mdtype="paragraph">align-item: 定义flex子项在flex容器的当前行的侧轴方向上的对齐方式</p>
                </li>
        </ul>
        </li>
        <li cid="n116" mdtype="list_item">
        <p cid="n117" mdtype="paragraph">text 文本</p>

        <ul cid="n118" data-mark="-" mdtype="list">
                <li cid="n119" mdtype="list_item">
                <p cid="n120" mdtype="paragraph">color: 黑色</p>
                </li>
        </ul>
        </li>
</ul>

<h3 cid="n121" mdtype="heading">2.2.2 页面结构-index.axml</h3>

<pre>
<code>&lt;div class="warpper"&gt;
 &lt;div class="text" onTap="onTap"&gt;{{text}}&lt;/div&gt;
&lt;/div&gt;</code></pre>

<ul cid="n123" data-mark="-" mdtype="list">
        <li cid="n124" mdtype="list_item">
        <p cid="n125" mdtype="paragraph">warpper 包装器</p>

        <ul cid="n126" data-mark="-" mdtype="list">
                <li cid="n127" mdtype="list_item">
                <p cid="n128" mdtype="paragraph">text 文本</p>
                </li>
                <li cid="n129" mdtype="list_item">
                <p cid="n130" mdtype="paragraph">onTap 点击</p>
                </li>
        </ul>
        </li>
</ul>

<h3 cid="n131" mdtype="heading">2.2.3 页面配置-index.json</h3>

<pre>
<code>{
 "usingComponents": {
},
 "state":{
   "text": "waft"
}
}</code></pre>

<ul cid="n133" data-mark="-" mdtype="list">
        <li cid="n134" mdtype="list_item">
        <p cid="n135" mdtype="paragraph">usingComponents 使用的组件</p>
        </li>
        <li cid="n136" mdtype="list_item">
        <p cid="n137" mdtype="paragraph">state 状态</p>

        <ul cid="n138" data-mark="-" mdtype="list">
                <li cid="n139" mdtype="list_item">
                <p cid="n140" mdtype="paragraph">text: 显示的文本为&quot;waft&quot;</p>
                </li>
        </ul>
        </li>
</ul>

<h3 cid="n141" mdtype="heading">2.2.4 页面逻辑-index.ts</h3>

<pre>
<code>import { JSON, JSONObject } from "waft-json";
import { console, getDataSource, Page, Props, Event, MessageEvent, setTimeout,window } from "waft";
export class Index extends Page {
 constructor(props: Props){
   super(props);
   // 设置默认的state
   this.setState(getDataSource());
}

 onTap(e: Event): void{
   // 点击事件
}

 onShow(): void{
   // 页面显示
     console.log('page onShow');
}
 onLoad(query: JSONObject): void{
   // 页面加载后
   console.log('page onLoad:' + JSON.stringify(query));
}
 onMessage(event: MessageEvent): void{
   // 信息推送更新
   console.log('page onMessage:' + JSON.stringify(event.data));
}
}</code></pre>

<h2 cid="n143" mdtype="heading">2.3 模板例程运行分析</h2>

<p cid="n144" mdtype="paragraph">进入工程目录运行:</p>

<pre>
<code>npm run start</code></pre>

<p cid="n146" mdtype="paragraph">先在浏览器中模拟运行该模板例程</p>

<p cid="n147" mdtype="paragraph"></p>

<p cid="n148" mdtype="paragraph">观察运行结果,可以看出一些明显的特征:</p>

<ul cid="n149" data-mark="-" mdtype="list">
        <li cid="n150" mdtype="list_item">
        <p cid="n151" mdtype="paragraph"><strong>背景是白色的</strong> &mdash;&mdash;页面样式表-index.ass中的.warpper里的background-color的值为白色,且页面结构-index.axml中使用的是&quot;warpper&quot;这个类。</p>
        </li>
        <li cid="n152" mdtype="list_item">
        <p cid="n153" mdtype="paragraph"><strong>字体是黑色的</strong> &mdash;&mdash;页面样式表-index.ass中的.text里的color的值为黑色,且页面结构-index.axml中使用的是&quot;text&quot;这个类。</p>
        </li>
        <li cid="n154" mdtype="list_item">
        <p cid="n155" mdtype="paragraph"><strong>文字内容为waft</strong> &mdash;&mdash; 页面结构-index.axml中使用的文字内容是{text},且页面配置-index.json中的 &quot;text&quot;内容为&quot;waft&quot;</p>
        </li>
</ul>

<p cid="n156" mdtype="paragraph">此外:mock.json中的两个值desc和percent暂时无用。</p>

<h2 cid="n157" mdtype="heading">2.4 模板例程参数修改</h2>

<p cid="n158" mdtype="paragraph">了解了模板工程中各代码的基础作用后,可以先简单修改一些参数,验证我们的想法。</p>

<p cid="n159" mdtype="paragraph">比如进行如下修改:</p>

<ul cid="n160" data-mark="-" mdtype="list">
        <li cid="n161" mdtype="list_item">
        <p cid="n162" mdtype="paragraph">index.acss修改背景色为灰色,并增加一种字体样式:</p>

        <pre>
<code>.warpper {
 background-color:gray;
 width:100%;
 height:100%;
 display:flex;
 flex-direction: column;
 justify-content: center;
 align-items: center;
}</code></pre>

        <p>&nbsp;</p>
        </li>
        <li cid="n164" mdtype="list_item">
        <p cid="n165" mdtype="paragraph">index.acss增加一种字体样式:</p>

        <pre>
<code>.textA{
 color: red;
}

.textB{
 color: green;
 font-size: 40px;
}</code></pre>

        <p>&nbsp;</p>
        </li>
        <li cid="n167" mdtype="list_item">
        <p cid="n168" mdtype="paragraph">index.json修改文字内容:</p>

        <pre>
<code>{
 "usingComponents": {
},
 "state":{
   "text1": "hello waft"
}
}</code></pre>

        <p>&nbsp;</p>
        </li>
        <li cid="n170" mdtype="list_item">
        <p cid="n171" mdtype="paragraph">index.axml修改显示内容,增加一行字,字段内容来源于之前未使用的mock.json中值:</p>

        <pre>
<code>&lt;div class="warpper"&gt;
 &lt;div class="textA" onTap="onTap"&gt;{{text1}}&lt;/div&gt;
 &lt;div class="textB" onTap="onTap"&gt;{{desc}}&lt;/div&gt;
&lt;/div&gt;</code></pre>

        <p>&nbsp;</p>
        </li>
</ul>

<p cid="n173" mdtype="paragraph">修改后的效果如下:</p>

<p cid="n174" mdtype="paragraph"></p>

<h1 cid="n175" mdtype="heading">3 按钮组件测试</h1>

<p cid="n176" mdtype="paragraph">参考如下文章:<a href="https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300867.0.0.24a8180flHP5QI&amp;id=4003826661371551744" spellcheck="false"><strong>【RISC-V 生态软件系列】Waft UI基础一:Button使用</strong></a></p>

<p cid="n177" mdtype="paragraph">获取源码:</p>

<pre>
<code>git clone git@gitee.com:tsing-qiu/waft-ui.git</code></pre>

<p cid="n179" mdtype="paragraph">主要是获取ui相关组件的代码,如下图的assembly中的各个文件夹,以及src文件夹下的各个例程,本篇先来测试button组件:</p>

<p cid="n180" mdtype="paragraph"></p>

<h2 cid="n181" mdtype="heading">3.1 将button源码添加到工程</h2>

<p cid="n182" mdtype="paragraph">将src文件夹中的test-button源码添加到工程中,如下图,然后修改app.json中的default字段为&ldquo;pages/button/index&rdquo;,这样就会默认显示按钮页面了:</p>

<p cid="n183" mdtype="paragraph"></p>

<p cid="n184" mdtype="paragraph">可以修改button源码中的相关参数,以实现自己想要的效果:</p>

<p cid="n185" mdtype="paragraph">比如我修改了index.axml:</p>

<pre>
<code>&lt;view class="wrapper"&gt;
 &lt;x-nav-bar showArrow="{{true}}" title="Button 测试"&gt;&lt;/x-nav-bar&gt;
 &lt;view style="flex: 1; padding-top: 30rpx; display: flex;flex-direction: column;"&gt;
   &lt;view class="title"&gt;1 按钮类型&lt;/view&gt;
   &lt;view class="flex"&gt;
     &lt;x-button text="普通"&gt;&lt;/x-button&gt;&lt;view class="dot"&gt;&lt;/view&gt;
     &lt;x-button type="tip" text="气泡"&gt;&lt;/x-button&gt;&lt;view class="dot"&gt;&lt;/view&gt;
     &lt;x-button type="primary" text="类型1"&gt;&lt;/x-button&gt;&lt;view class="dot"&gt;&lt;/view&gt;
     &lt;x-button type="secondary" text="类型2"&gt;&lt;/x-button&gt;&lt;view class="dot"&gt;&lt;/view&gt;
   &lt;/view&gt;
   &lt;view class="title"&gt;2 不同大小的按钮&lt;/view&gt;
   &lt;view class="flex"&gt;
     &lt;x-button type="primary" text="小按钮" size="small"&gt;&lt;/x-button&gt;&lt;view class="dot"&gt;&lt;/view&gt;
     &lt;x-button type="primary" text="中按钮" &gt;&lt;/x-button&gt;&lt;view class="dot"&gt;&lt;/view&gt;
     &lt;x-button type="primary" text="大按钮" size="large"&gt;&lt;/x-button&gt;&lt;view class="dot"&gt;&lt;/view&gt;
   &lt;/view&gt;
   &lt;view class="title"&gt;3 带图标的按钮&lt;/view&gt;
   &lt;view class="flex"&gt;
     &lt;x-button type="secondary" text="按钮" iconURL="https://gw.alicdn.com/imgextra/i1/O1CN0192HvCz1vntR4jzNJ9_!!6000000006218-2-tps-20-20.png"&gt;&lt;/x-button&gt;&lt;view class="dot"&gt;&lt;/view&gt;
   &lt;/view&gt;
   &lt;view class="title"&gt;4 自定义颜色的按钮&lt;/view&gt;
   &lt;view class="flex"&gt;
     &lt;x-button text="按钮" bgColor="#ff976a"  borderColor="#ff976a" textColor="#ffffff"&gt;&lt;/x-button&gt;&lt;view class="dot"&gt;&lt;/view&gt;
   &lt;/view&gt;
 &lt;/view&gt;
&lt;/view&gt;</code></pre>

<h2 cid="n187" mdtype="heading">3.2 升级组件功能与编译</h2>

<p cid="n188" mdtype="paragraph">修改完后进行编译:</p>

<pre cid="n189" lang="sh" mdtype="fences" spellcheck="false">
.build</pre>

<p cid="n190" mdtype="paragraph">可能会提示如下的错误:waft-ui-common.ts找不到:</p>

<p cid="n191" mdtype="paragraph"></p>

<p cid="n192" mdtype="paragraph">这时需要升级waft-ui组件:</p>

<pre cid="n193" lang="sh" mdtype="fences" spellcheck="false">
npm i waft-ui --save
升级完组件之后,即可编译成功。</pre>

<h2 cid="n196" mdtype="heading">3.3 运行测试</h2>

<p cid="n197" mdtype="paragraph">现在浏览器中查看运行效果:</p>

<p cid="n198" mdtype="paragraph"></p>

<p cid="n199" mdtype="paragraph">再到板子中查看运行效果,比较奇怪的时,浏览器预览的和板子里实际运行的,效果不一样,如下图:</p>

<p cid="n200" mdtype="paragraph"></p>

<p cid="n201" mdtype="paragraph">再次修改相关参数,修改assembly里的button.acss和base.acss中的相关的数值,以及修改app.json里的宽高为480。</p>

<p cid="n202" mdtype="paragraph">排列整齐了一点,不过不同大小的按钮,还是不能正常显示为不太的大小,不知道哪里还没改到位:</p>

<p cid="n203" mdtype="paragraph"></p>

<h1 cid="n204" mdtype="heading">4 总结</h1>

<p cid="n205" mdtype="paragraph">本篇详细分析了Waft基础例程的工程模板中各文件的基础作用,并通过修改参数验证猜想,最后通过新加一个button页面来进一步测试Waft的开发使用。</p>

<p cid="n206" mdtype="paragraph">&nbsp;</p>

<p cid="n207" mdtype="paragraph">&nbsp;</p>
页: [1]
查看完整版本: 【平头哥Sipeed LicheeRV 86 Panel测评】12-Waft例程分析与按钮功能测试