目录

  • HarmonyOS实战
    • 前言
    • 创建卡片
    • 卡片的样式开发
      • 布局设计
        • index.hml
        • index.css
        • index.json
    • 卡片的交互
      • 卡片数据的初始化
      • 卡片的定时更新
    • 权限设置

HarmonyOS实战

前言

六月以来,欧洲杯正让国内的体育迷陷入狂欢。特别是今晚,欧洲杯1/4决赛正式开启大幕,相信观看的国人会越来越多。

那么在鸿蒙手机上,设计一个欧洲杯卡片,用于在桌面提醒各位球迷可谓相得益彰,毕竟实时球讯,亮屏即达。

首先,我们需要分析一下欧洲杯赛事的卡片布局,如上图所示。

  1. 布局之中,有一张图片以及一段资讯文字
  2. 同时,卡片自动轮播实时的欧洲资讯内容。

对于布局来说,很好理解,就是一个图片和一个文本内容。而卡片内容的自动轮播就是定时触发的内容替换。

创建卡片

当我们创建了一个鸿蒙App项目之后,我们需要在点击src右键进行卡片的创建,如下图所示:


如首图所示,因为是一个22的卡片,这里我们可以随意选择一个22的布局即可,反正后面的所有样式以及交互都需要修改。


到这里,我们的卡片就创建完成了。

而在项目之中,会多2个widget文件,一个是java之中的,用于卡片与用户的交互与生成。另一个是js里面的widget,用于界面的设计。

卡片的样式开发

布局设计

既然卡片已经创建完成,也知道了欧洲杯赛事的卡片设计需要分2个步骤,那么这里我们先来实现其样式与布局,至于功能代码,后续介绍。

index.hml

首先,我们需要通过index.hml文件实现一个图片以及文本的布局。代码如下:

<div class="card_root_layout" onclick="routerEvent1"><image class="div_image" src="{{imageUrl}}"/><text class="div_text">{{titleName}}</text>
</div>

简单来说,就4行代码,毕竟布局很简单。

index.css

接着,设计我们欧洲杯赛事卡片的样式,代码如下:

.card_root_layout {flex-direction: column;align-items: center;width: 100%;margin: 10px;height: 100%;
}.div_image{width: 200px;height: 112px;object-fit: fill;
}.div_text{margin-top: 5px;font-size: 10px;color: black;font-family: sans-serif;
}

index.json

最后,就是我们的交互以及卡片的数据,index.json决定了交互的方式以及数据,但是实现代码在java文件中,index.json只用作定义。代码如下:

{"data": {"titleName": "","imageUrl": ""},"actions": {"routerEvent1": {"action": "router","abilityName": "com.liyuanjinglyj.europeancup.widget.WidgetAbility","params": {"message": "button"}}}
}

如上面代码所示,这里定义了2个数据:titleName(欧洲杯赛事标题),imageUrl(欧洲杯赛事图片)。

还有一个路由跳转,毕竟点击资讯我们是为了查看详细的内容的。

卡片的交互

卡片数据的初始化

当用户添加或者查看卡片内容时,它是有一个基本的数据的。所以,我们需要在java中获取图片以及文本然后传递给卡片。代码如下(WidgetImpl):

public class WidgetImpl extends FormController {private static final HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0x0, WidgetImpl.class.getName());private static final int DEFAULT_DIMENSION_2X2 = 2;private String url = "https://harmony-1300376177.cos.ap-shanghai.myqcloud.com/europeancup.json";private int size=0;public WidgetImpl(Context context, String formName, Integer dimension) {super(context, formName, dimension);}//获取网络数据private ZSONArray getData() {LYJHttps lyjHttps = new LYJHttps();String response = lyjHttps.doGet(url);ZSONObject jsonStr = ZSONObject.stringToZSON(response);ZSONObject result = jsonStr.getZSONObject("result");ZSONArray data = result.getZSONArray("data");this.size=data.size();return data;}//卡片的初始化@Overridepublic ProviderFormInfo bindFormData() {HiLog.info(TAG, "bind form data");ProviderFormInfo providerFormInfo = new ProviderFormInfo();if (dimension == DEFAULT_DIMENSION_2X2) {ZSONObject zsonObject = new ZSONObject();HiLog.info(TAG, "update form data: formId" + ((ZSONObject) (getData().get(0))).getString("img"));zsonObject.put("imageUrl", ((ZSONObject) (getData().get(0))).getString("img"));zsonObject.put("titleName", ((ZSONObject) (getData().get(0))).getString("title"));providerFormInfo.setJsBindingData(new FormBindingData(zsonObject));}return providerFormInfo;}//卡片的更新@Overridepublic void updateFormData(long formId, Object... vars) {HiLog.info(TAG, "update form data: formId" + formId);}//卡片的事件处理@Overridepublic void onTriggerFormEvent(long formId, String message) {HiLog.info(TAG, "onTriggerFormEvent.");}//卡片的界面跳转@Overridepublic Class<? extends AbilitySlice> getRoutePageSlice(Intent intent) {HiLog.info(TAG, "set route page slice.");ZSONObject zsonObject = ZSONObject.stringToZSON(intent.getStringParam("params"));if (zsonObject.getString("message").equals("button")) {return WidgetSlice.class;}return null;}
}

这里就是获取数据,然后传递到js卡片当中。

通过providerFormInfo.setJsBindingData()方法进行数据的初始化,而基础数据在ZSONObject中进行添加。

到这一步,读者可以运行App添加卡片,其已经具有展示的效果了。但是卡片不会自动替换数据,因为我们没有设置定时替换数据的代码。

卡片的定时更新

所以,我们需要给卡片设置定时的数据替换,让其轮播当前的所有欧洲杯赛事资讯。这样,新鲜资讯就可以通过这么一个2*2卡片全部显示出来。

代码如下(WidgetAbility):

public class WidgetAbility extends Ability {private ZSONArray zsonArray;// 定时器,每秒执行一次private void startTimer(long formId) {this.zsonArray= LYJUtils.getData("https://harmony-1300376177.cos.ap-shanghai.myqcloud.com/europeancup.json");Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {updateForms(formId);}},0,5000);}//更新卡片private void updateForms(long formId){int max=this.zsonArray.size()-1,min=0;int ran2 = (int) (Math.random()*(max-min)+min);ZSONObject zsonObject=new ZSONObject();zsonObject.put("imageUrl", ((ZSONObject) (zsonArray.get(ran2))).getString("img"));zsonObject.put("titleName", ((ZSONObject) (zsonArray.get(ran2))).getString("title"));FormBindingData bindingData=new FormBindingData(zsonObject);try {if(!updateForm(formId,bindingData)){HiLog.error(TAG,"updateForm error");}}catch (FormException e){HiLog.error(TAG,"updateForm error");}}@Overrideprotected ProviderFormInfo onCreateForm(Intent intent) {HiLog.info(TAG, "onCreateForm");long formId = intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY, INVALID_FORM_ID);String formName = intent.getStringParam(AbilitySlice.PARAM_FORM_NAME_KEY);int dimension = intent.getIntParam(AbilitySlice.PARAM_FORM_DIMENSION_KEY, DEFAULT_DIMENSION_2X2);HiLog.info(TAG, "onCreateForm: formId=" + formId + ",formName=" + formName);FormControllerManager formControllerManager = FormControllerManager.getInstance(this);FormController formController = formControllerManager.getController(formId);formController = (formController == null) ? formControllerManager.createFormController(formId,formName, dimension) : formController;if (formController == null) {HiLog.error(TAG, "Get null controller. formId: " + formId + ", formName: " + formName);return null;}//启动定时任务this.startTimer(formId);return formController.bindFormData();}}

这里,我们通过定义定时器任务每5秒进行更新卡片,同时在onCreateForm()函数中,启动定时任务。至于卡片的数据,通过随机数自动获取。

权限设置

除此之外,我们还需要设置网络权限等基本的数据代码。

"module": {"reqPermissions": [{"name": "ohos.permission.INTERNET"},],
}

到这里,我们卡片的交互以及卡片的布局都已经设计完成,运行之后的效果也与首图一摸一样。

源代码下载地址:https://gitee.com/liyuanjinglyj/EuropeanCup

本文正在参与“有奖征文 | HarmonyOS征文大赛”活动:

活动链接:https://marketing.csdn.net/p/ad3879b53f4b8b31db27382b5fc65bbc

HarmonyOS实战—欧洲杯还可以这么玩?相关推荐

  1. 球迷 如何在Linux纯命令行玩转谷歌浏览器,边看欧洲杯,边看足球宝贝

    大家好,我是Lex 喜欢欺负超人那个Lex 擅长领域:python开发.网络安全渗透.Windows域控Exchange架构 今日重点: 1.Linux骚操作:纯命令行玩转GoogleChrome浏览 ...

  2. Python数据分析实战(2)——探索2012欧洲杯数据

    个人复习总结(jupyter) 练习来源:工作台 - Heywhale.com 1导入必要的库和创建数据 import pandas as pd 路径='D:/数据分析有关数据集/十套练习/exerc ...

  3. 伪元素写竖线_欧洲杯 | 让我们做个时髦伪球迷

    男票在看球你只能跟着嗑瓜子 电视上播的什么你完全是一脸懵逼! 对于运动神经普遍不是很发达的女生来说 欧洲杯什么的基本就是一件纯凑热闹的事情 偶尔出现一两个帅气逼人的球员才能稍微打起点精神来 ▼ 俗话说 ...

  4. 球迷必备:2012欧洲杯手机观战指南

    如果你是一名忠实的足球迷,那开战在即的欧洲杯绝对是不容错过的足球盛宴,如果有幸能够亲临现场感受欧洲杯的气氛,那绝对是人生一大乐事.可是,并不是每个球迷都能够有幸前往现场一睹为快,感受那独特的氛围. 不 ...

  5. HarmonyOS实战 —基于hi3861芯片鸿蒙2.0的避坑指南

    HarmonyOS实战 -基于hi3861芯片鸿蒙2.0的避坑指南 特别说明:本文章与卡片开发无关,想看卡片开发的不用往下读了 最近学习鸿蒙设备开发的过程中遇到了很多问题,因为目前几乎所有设备开发教程 ...

  6. 这届欧洲杯有点凉?但中国广告主绝不认输

    欧洲杯已经热闹地进入了决赛,但起初很多人并不看好今年的赛事热度. 原因也很简单,一方面由于海外疫情的关系,原定于2020年举办的赛事已经延期了一年.而另一方面,则是与往年某一个国家主办不同,今年的欧洲 ...

  7. [转载]欧洲杯四强之魔兽争霸版

    欧洲杯的战场上没有所谓侥幸,尤其在淘汰赛阶段,这是一个必须要杀到天昏地暗你死我活才见胜负分晓的修罗场. 4场1/4决赛,有3场打到加时,其中两场靠点球才分出胜负,而那场没有进行加时点比赛,也留下一个3 ...

  8. HarmonyOS实战—卡片的样式设计

    目录 HarmonyOS实战 HarmonyOS卡片样式设计 卡片的布局文件 自定义2*4的卡片布局 HarmonyOS实战 HarmonyOS卡片样式设计 从鸿蒙手机的左下角屏幕向上滑动,就能打开我 ...

  9. 腾讯欧洲杯竞猜创奇迹 剑指伦敦奥运

    欧洲杯刚刚落下帷幕,足球带来的激情余韵未息.竞猜活动也借着这股足球风在这不到一个月的时间里大红大紫了一把.腾讯欧洲杯竞猜以日活跃用户100万.总参与用户量近千万再创业界奇迹. 参与用户量近千万 再创业 ...

最新文章

  1. Jtabbedpane设置透明、Jpanel设置透明
  2. boost::geometry::geometry_id用法的测试程序
  3. python反转字符串的元音字母_345. 反转字符串中的元音字母-----leetcode刷题(python解题)...
  4. 解锁redis锁的正确姿势
  5. 在服务器端渲染完毕的 Angular Component,在客户端还会重新渲染一次吗?
  6. OpenStack精华问答 | OpenStack 网络中 OpenFlow 规则的作用是什么?
  7. matlab arma 仿真,基于Matlab的ARMA模型时间序列分析法仿真
  8. 《学习日记之Python》——GIF分解成图片
  9. pscc显示无法访问adobe服务器,Adobe Photoshop 提示无法加载扩展,因为它未经正确签署错误提示解决方案...
  10. 夜神模拟器使用过程遇到的问题
  11. html5新年网页做给父母的,2020给父母的新年祝福语
  12. 数值分析复化求积matlab,MATLAB数值分析实验二(复合梯形、辛普森和龙贝格求积,以及二重积分计算等)...
  13. c++ 模板----成员函数模板
  14. tomcat--catalina
  15. Bug敏感度与软件质量关系
  16. PMBOK(第六版) PMP笔记——《四》第四章(项目整合管理)
  17. Shopfa:有哪些果蔬生鲜电商平台?
  18. 【DL】图像去噪中的patch size是什么(1篇文章链接和1段代码)
  19. 主题:Django资源大全
  20. 提示工程L2:提示迭代

热门文章

  1. 幻想三国志 游戏流程详尽全攻略 4
  2. 渲染层错误ReferenceError: __g is not defined
  3. Polysemy Deciphering Network for Human-Object Interaction Detection论文阅读笔记
  4. 2013江苏计算机二级vfp试题,求:2006.3.11日江苏计算机二级VFP试题和答案刚考 爱问知识人...
  5. 基于51单片机红外遥控人体感应自动车库门控制设计(程序+Proteus仿真+原理图+PCB图+参考论文+开题报告+任务书等)
  6. 用physon代码生成一个打飞机小游戏
  7. python中eval的用法?
  8. Mybatis(第二篇:联表查询)
  9. 点分治题单(来自XZY)
  10. 【iOS】接口与API设计