开发跨设备的鸿蒙(HarmonyOS) App

为了让更多的人看到本文,请各位读者动动小手,点击右上角【...】,将本文分享到朋友圈,thanks! 


如今的智能设备种类愈来愈多,并且这些智能设备的屏幕尺寸、分辨率都不一样,例如,比较常见的智能设备有手机、平板电脑、车载电脑、智能电视、智能手表等。尽管这些设备都有屏幕,但它们的屏幕千差万别,有的屏幕尺寸小,有的屏幕尺寸大,有的是纵向的屏幕,有的是横向的屏幕,有的带触摸功能,有的不带触摸功能,甚至有的设备的屏幕是圆形(如智能手表),这就给开发App带来了麻烦。如今几乎每个智能设备厂商,如Apple、华为都面临这个问题。这就要求咱们开发的App尽量适合更多的智能设备。
固然,最简单,最直接的方式是为每一类智能设备单独开发App。例如,为手机开发一款App,为智能电视开发一款App,为智能手表开发一款App。这么作尽管从技术上是可行的,但因为这些不一样设备的App,尽管在UI展示上不一样,但大多数逻辑代码是相同的。若是单独为不一样的设备开发App,将会形成大量的代码冗余。因此我推荐的方案是让一个App同时适用于不一样的智能设备。基本的原理是在App运行时会自动检测当前的设备,而后会执行与特定设备相关的代码,使用与特定设备相关的布局和资源。
这里的关键点是检测当前的设备类型。在建立HarmonyOS工程时,要么建立TV(华为智慧屏)工程,要么建立Wearable(智能手表)工程,因此使用模板建立的HarmonyOS工程只能在一类设备(TVWearable)中运行。读者能够经过config.json文件的deviceType属性查看当前工程能够运行的设备类型,若是建立的是TV工程,deviceType属性的值以下:
"deviceType": ["tv" ]
若是建立的是Wearable工程,deviceType属性的值以下:
"deviceType": ["wearable" ]
若是deviceType属性的值是tv,当前工程是不能在智能手表上运行的,反之亦然。要想让当前工程同时在TVWearable上运行,须要同时指定tvwearable(要手动修改config.json文件),配置代码以下:
"deviceType": ["tv","wearable" ]
当完成deviceType属性的设置后,当前工程就能够同时在TVWearable上运行了。不过因为TVWearable的屏幕尺寸相差太多,因此布局一般会采用彻底不一样的样式。在HarmonyOS中,可使用Java语言动态建立组件的方式实现布局,也可使用布局文件。关于布局文件的使用,在后面的文章中会详细介绍。本文主要讨论使用Java代码动态建立组件的布局方式。
在建立的HarmonyOS工程中会自动生成一个样例代码,这些代码主要集中在MainAbilitySlice.java文件中的onStart方法中,代码以下:
public void onStart(Intent intent) {
        super.onStart(intent); LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT); myLayout.setLayoutConfig(config); ShapeElement element = new ShapeElement(); element.setRgbColor(new RgbColor(255, 255, 255)); myLayout.setBackground(element); Text text = new Text(this); text.setLayoutConfig(config); text.setText("Hello World"); text.setTextColor(new Color(0xFF000000)); text.setTextSize(50); text.setTextAlignment(TextAlignment.CENTER); myLayout.addComponent(text);super.setUIContent(myLayout); }
读者并不须要对这段代码的每一行都了解,只须要知道这段代码将背景设为白色,而且在建立了一个用于显示文本的Text组件,而且在屏幕中心显示Hello World。若是在TV设备上运行,效果如图1所示。不过这样以来,在全部的设备中的UI都同样,但咱们的目的是让不一样的设备显示不一样的UI,因此就须要经过下面的代码判断当前设备的类型。
if(DeviceInfo.getDeviceType().equals("tv")) {  ... ...} else if(DeviceInfo.getDeviceType().equals("wearable")) { ... ...}

图1
其中getDeviceType方法返回的值就是App当前运行设备的类型。若是运行在TV上,值为tv,若是运行在智能手表上,值为wearable。因此能够用下面的代码来替换onStart方法中的代码。
public void onStart(Intent intent) { super.onStart(intent); LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT); myLayout.setLayoutConfig(config); ShapeElement element = new ShapeElement(); element.setRgbColor(new RgbColor(255, 255, 255)); myLayout.setBackground(element); Text text = new Text(this); text.setLayoutConfig(config);if(DeviceInfo.getDeviceType().equals("tv")) { // 运行在TV上执行的代码 text.setText("华为智慧屏"); text.setTextColor(new Color(0xFFFF0000)); text.setTextSize(200); } else if(DeviceInfo.getDeviceType().equals("wearable")) {// 运行在Wearable上执行的代码 text.setText("华为智能手表"); text.setTextColor(new Color(0xFF0000FF)); text.setTextSize(50); } text.setTextAlignment(TextAlignment.CENTER); myLayout.addComponent(text); super.setUIContent(myLayout); }

在这段代码中,将TVWearable上显示的文本内容、文本尺寸和文本颜色作了改变,因此在TVWearable上显示的文本是不一样的。在TV上显示的效果如图2所示。在Wearable上显示的效果如图3所示。
 

图2 在TV上显示的效果

图3 在Wearable上显示的效果

- EOF -javascript

推荐阅读  点击标题可跳转

1. 比Python更牛的语言有吗?看我用元类(metaclass)花式建立Python类java

2. 见鬼!导入Python模块执行了全部代码,你不知道__name__变量是什么意思吗?
web

3. 连Python产生器(Generator)的原理都解释不了,还敢说Python用了5年?编程

4. 牛掰了!鸿蒙与Android完美融合,将鸿蒙设备当Android设备用json

5. 【鸿蒙学院】鸿蒙App开发直播学员提问与回答微信

6. 【鸿蒙学院】鸿蒙IDE:下载、安装DevEco Studioapp

7.  Python高效编程之88条军规(2):你真的会格式化字符串吗?布局


关注「极客起源」公众号,加星标,不错过精彩技术干货
ui





本文分享自微信公众号 - 极客起源(geekculture)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。this

相关文章
相关标签/搜索