移动开发
文章平均质量分 78
面向对象思考
这个作者很懒,什么都没留下…
展开
-
自学HarmonyOS应用开发(75)- 显示拍摄结果
照片拍摄完成接下来的动作就是确认拍照结果。我们的实现方法是对前面文章中用到的文件浏览器功能进行扩展,从而实现一个简单的照片浏览器功能。增加照片浏览器画面照片浏览器画面使用下面的布局。代码中用到的FileListContainer,LayoutSeparator都在之前的文章中有过说明,这里就不再赘述了。和这个布局文件配套的页面文件如下:准备ListContainer相关类稍微需要说明的是,这个BrowserSlice类会在onStart方法中从Intent参数中获取一个浏览原创 2022-06-21 20:30:36 · 336 阅读 · 0 评论 -
自学HarmonyOS应用开发(74)- 拍摄照片
断更有一段时间,今天继续。相机准备好了之后,就开始实际拍摄照片。首先稍微回退一下,在打开相机时,我们设置了用于保存图像的listener(以下代码的第2行):当用户按下【拍照】按钮时,架构会触发下面的处理:代码第8行会调用cameraDevice的triggerSingleCapture方法。如果方法被成功执行,下面的saveImage方法会被执行:如果一切顺利,就可以看到第10行代码显示的"Take photo succeed"提示。就像下面的视频这样:视频到目前为止的内容原创 2022-06-15 20:11:57 · 675 阅读 · 1 评论 -
自学HarmonyOS应用开发(73)- 准备相机(2)
画面布局初始化MainAbilittySlice的初始化代码如下:代码中只是调用了如下的组件初始化代码:目前这段代码只是为两个按钮指派功能。其中【初始化】按钮的功能如下:它的功能是初始化相机,有一点需要注意的是:构建params时使用的参数必须和前一篇文章中说明的布局文件中为id:surface_container指定的属性相同。当初始化过程结束后,下面的回调函数会被执行:的那个surface被成功创建之后,就可以打开相机了:原创 2022-06-05 19:52:36 · 539 阅读 · 4 评论 -
自学HarmonyOS应用开发(72)- 准备相机(1)
相机是手机的常用功能,同时也是许多更高阶功能的基础。本文按步骤详细介绍Harmony应用开发中启动相机的过程。声明相机相关权限相机相关功能可能用到的权限包括:照相机权限,读写存储存储空间权限,访问麦克风权限和获取定位权限。这些权限首先需要在config.json中进行声明。{... "module": {"abilities":[ { "skills": [ { "entities": [ ...原创 2022-05-28 19:22:00 · 389 阅读 · 0 评论 -
自学HarmonyOS应用开发(71)- 优化目录间迁移体验
通过前面几篇文章,虽然我们实现了在各级目录之间进行切换的功能,但还是有一些不够方便的地方。例如: 返回上级目录之前必须首先当前回到目录的最顶端 退回上级目录之后,总是回到该目录的最顶端。这对于希望继续浏览目录内容的用户很不友好 针对这两个问题,我们采取如下对策: 通过画面顶端的操作区实现返回上级目录功能 每次进入下级目录时记录当前表示位置,从下级目录返回时恢复这个表示位置。 修改后的动作视频如下:演示动作返回上级目录按钮画面最上面操作区的布局文件中和原创 2022-05-22 20:27:31 · 328 阅读 · 1 评论 -
自学HarmonyOS应用开发(70)- 解决ListContainer默认优化问题
列表项布局表示问题使用FileBrowser在目录之间进行切换时,发现了一个问题:本来只应该在出现在返回上级目录列表项上面的<<按钮会按照一定的频率出现在其他列表项上。具体请参见下面的视频:经过各种尝试之后得到的结论是问题出在下面的代码:@Overridepublic Component getComponent(int i, Component component, ComponentContainer componentContainer) { HiLog.info(原创 2022-05-15 19:55:54 · 377 阅读 · 1 评论 -
自学HarmonyOS应用开发(69)- 获取并表示手机目录结构
和文件存储比较起来,一般用户更关心的是文件系统的目录结构。本文介绍获取和表示目录结构的方法。先看演示视频:演示视频File类这是一个Java中的标准类,提供跨平台的文件访问功能。本文主要使用文件类的下面几个功能:方法名 功能 listRoots 列举文件系统中根目录,Linux系统中只有一个根目录 listFiles 列举指定目录中的所有目录和文件 isDirectory 判断当前文件是否问目录 BrowserItem类目录项的基类,功能是封装原创 2022-05-08 19:26:06 · 1579 阅读 · 1 评论 -
自学HarmonyOS应用开发(68)- 获取并表示文件系统信息
接下来我们想通过一个文件浏览器应用,练习文件系统操作,文件表示等功能,本文首先说明获取并表示文件系统内容的方法。还是先看演示视频:演示视频构建FileStore表示画面首先为准备画面布局:<?xml version="1.0" encoding="utf-8"?><xwg.filebrowser.DynamicLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="m原创 2022-04-24 19:38:55 · 1210 阅读 · 0 评论 -
自学HarmonyOS应用开发(67)- 自定义布局(2)
布局文件示例接下来使用一个实际的布局为例,介绍动态调整组件高度的实现方法。布局内容如下:<?xml version="1.0" encoding="utf-8"?><xwg.filebrowser.DynamicLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:background_原创 2022-04-13 19:30:12 · 503 阅读 · 0 评论 -
自学HarmonyOS应用开发(66)- 自定义布局(1)
Harmony应用开发文档中为Java开发者提供了6种UI布局,可以满足开发者的大部分需求。但是有一个问题是:这些布局一旦显示,用户便无法进行调整。我们开发一个自定义布局来解决这个问题。以下是效果演示:效果演示内容比较多,今天是第一部分,先实现一个按比例分配显示空间的布局。定义DynamicLayout类自定义布局类除了要继承ComponentContainer类的功能之外,还要实现EstimateSizeListener和ArrangeListener接口的功能。原创 2022-04-07 20:08:24 · 1274 阅读 · 0 评论 -
自学HarmonyOS应用开发(65)- 为Tab组件使用图像资源
用图像装饰UI组件可以让应用显得更专业,本文介绍Tab组件使用图像资源的方法。先看动作效果:动作演示准备图像需要为每个Tab组件准备选中状态和非选中状态两个图像。这些图像可以自己画,也可以利用现成的资源。一个技巧是是可以修改彩色图像的到一个暗色图像作为非选中状态图像使用。本例中的图像都使用png格式保存在media目录中。使用图像为了方便使用,准备了下面的帮助函数:void setTabImage(TabList.Tab tab, int image_id原创 2022-04-04 18:28:24 · 507 阅读 · 0 评论 -
自学HarmonyOS应用开发(64)- 处理屏幕旋转
旋转屏幕是手机用户的一个日常操作,本文介绍如何在屏幕旋转时自动调整屏幕布局的方法。效果如下:视频演示间接处理屏幕旋转默认情况下用户旋转屏幕时,Harmony应用架构会调用AbilitySlice类的onStart方法,所以原则上讲,只要开发者在onStart中获取屏幕方向并选择适当的画面布局就间接处理了屏幕旋转。如果稍加调查,可以发现Ability类有一个颇具迷惑性的方法:public int getDisplayOrientation()但是很遗憾,这个方法返回的是开发者原创 2022-03-28 19:31:07 · 704 阅读 · 0 评论 -
自学HarmonyOS应用开发(63)- 对象关系映射数据库升级
问题的背景随着应用开发的不断深入,或早或晚都会产生升级数据库结构的需求。这种升级可以是为特定的数据表添加字段,也可以是增加新表等。以秒表应用为例,升级之前的表构成如下,这个数据库中一共包含3个表:@Database(entities = {TimeRecord.class, TileData.class, Setting.class}, version = 1)public abstract class StopWatchDB extends OrmDatabase {}假设我们需要增加第原创 2022-03-21 19:23:02 · 1630 阅读 · 0 评论 -
自学HarmonyOS应用开发(62)- 使用对象关系映射数据库保存设定信息
除了地图数据,秒表应用还有一些其他希望保存的数据,例如上次定位的位置,地图画面的缩放比例等。本文介绍通过对象关系映射数据库技术保存这些信息的方法。通用的设定信息表下面的代码定义了用于保存设定信息的通用的表结构:@Entity(tableName = "setting", ignoredColumns = {"LABEL"}, indices = {@Index(value = {"segment", "item"}, name = "setting_index"原创 2022-03-13 12:55:34 · 431 阅读 · 0 评论 -
自学HarmonyOS应用开发(61)- 使用异步派发任务后台更新地图数据
当第一次表示某地的地图数据时,由于数据需要从网络下载,因此会造成初次表示时间过长而影响响应速度的问题。我们使用异步派发任务解决这个问题。先看显示效果:动作演示https://v.qq.com/x/page/t3326ze5321.html?sf=uri我们甚至可以在地图更新过程中拖动地图。画面更新时记录需要获得的地图数据以下是描画地图数据的代码:private void drawTiles(Canvas canvas){ int tileCol = Tile原创 2022-03-06 18:15:59 · 537 阅读 · 0 评论 -
自学HarmonyOS应用开发(60)- 使用异步延迟派发任务实现操作延时
当我们使用地图功能实时跟踪设备位置的时候,一般会希望保证可以显示最新位置。但也有可能操作者希望确认周边信息而暂时脱离最新位置,等周边信息确认完成之后再自动回到最新位置。动作视频如下:动作视频我们通过发布异步延迟派发任务来实现这个功能。计算无操作时间我们准备一个定时器,每当用户对屏幕进行操作时更新最后操作时刻。void resetOperationTimer(){ lastOperation = Calendar.getInstance().getTimeInMilli原创 2022-02-27 09:31:56 · 672 阅读 · 0 评论 -
自学HarmonyOS应用开发(59)- 处理拖动事件
地图软件的一个常用功能就是地图拖动功能,本文介绍它是如何实现的。实现DraggedListener在Harmony应用中通过实现Component.DraggedListener接口处理拖动事件,这个接口的方法一共有6个,这里我们只是用其中的3个:onDragPreAccept用于判断是否接受某个拖动操作,这里我们一律返回true,表示接受所有的拖动操作。Component.DraggedListener dragListener = new Component.DraggedList原创 2022-02-13 19:23:29 · 506 阅读 · 0 评论 -
自学HarmonyOS应用开发(58)- 接受来自Service的通知
PageAbility和ServiceAbility之间的交互可以有两种方式:一种是主动查询,也就是自学HarmonyOS应用开发(57)- 与Service进行交互中介绍的方式,还有一种是被动接受来自ServiceAbility的通知。本文介绍后一种方式。涉及到的类比较多,关系比较复杂:接受通知的接口类首先在StopWatchServiceConnection类中定义接受ServiceAbilitty通知的接口类:public interface StopWatchEventLi原创 2022-01-23 18:56:49 · 477 阅读 · 0 评论 -
自学HarmonyOS应用开发(57)- 与Service进行交互
生成一个Service之后,就需要构建一个Connection对象并通过它实现PageAbility和ServiceAbility之间的交互。构建自己的Connection类StopWatchServiceConnection类的主要功能有两个:一是接受连接成功通知并获取服务端传过来的用于通信的IRemoteObject对象,这是onAbilityConnectDone方法的主要工作;二是接收连接成功切断时的通知。public class StopWatchServiceConnectio原创 2022-01-20 18:24:58 · 661 阅读 · 0 评论 -
自学HarmonyOS应用开发(56)- 用Service保证应用在后台持续运行
秒表程序的功能当然是计时,但是Harmony应用的默认动作是切到后台之后程序会退出,无法实现连续计时。首先来看效果视频:创建Service类首先创建一个Ability的子类StopWatchService:public class StopWatchService extends Ability { private static final int NOTIFICATION_ID = 0XD0000002; private static final String TAG原创 2022-01-11 19:16:20 · 743 阅读 · 0 评论 -
自学HarmonyOS应用开发(54)- 校正定位偏差
上一篇文章已经介绍了如果获取当前所在位置的方法,这种方法存在一个问题:和实际位置之前存在500米左右的偏差。原因调查经过一番调查,结论是gps信号使用的是WGS-84坐标系,而高德地图使用的是GCJ-02火星坐标系,只有经过坐标变换才能显示正确的位置。这方面的文章网上有很多,这里采用以下博客文章中的代码:https://www.cnblogs.com/blogger-Li/p/11616835.html代码如下:// 本代码引用自Hugo_nice下面的博客文章// https:原创 2022-01-02 15:09:22 · 633 阅读 · 0 评论 -
自学HarmonyOS应用开发(53)- 获取当前位置
目前的地图软件只能表示固定位置的地图,我们希望在画面第一次启动时能够显示当前所在位置的地图。首先来看动作效果视频:声明定位权限修改所在HAP的config.json文件,以便获取定位权限:"reqPermissions": [ ... { "name": "ohos.permission.LOCATION", "reason": "$string:reason_location", "usedScene": { "ability": [原创 2021-12-25 15:04:26 · 1395 阅读 · 0 评论 -
自学HarmonyOS应用开发(52)- 地图数据拼接和缓存
上一篇文章中我们获取了当前位置所处的地图瓦片并表示,本文介绍获取更多的瓦片数据并进行拼接的方法。动作演示视频如下:地图数据拼接和缓存瓦片数据类我们假设显示区域的中心是当前位置,以这个位置为中心分别向上下左右扩展地图瓦片就可以铺满整个表示区域的地图数据。为了方便管理,我们设计了瓦片数据类:public class Tile extends PixelMapHolder { static final HiLogLabel LABEL = new HiLogLabel(HiLog原创 2021-12-18 18:12:50 · 696 阅读 · 0 评论 -
自学HarmonyOS应用开发(51)- 获取瓦片地图数据(续)
计算瓦片位置根据前一篇文章中说明的计算方法,我们提供以下代码实现://https://wiki.openstreetmap.org/wiki/Slippy_map_tilenamesint getTileCol(double long_deg, int zoom){ int total_cols = (int)Math.pow(2, zoom); return (int)((long_deg + 180)/360 * total_cols);}int getTileRow(doubl原创 2021-12-06 19:52:10 · 567 阅读 · 0 评论 -
自学HarmonyOS应用开发(50)- 获取瓦片地图数据
本文首先介绍实现地图功能的第一步:获取瓦片地图数据。瓦片地图原理读者可以参照文后的链接了解瓦片地图的原理,这里不再重复。简单地说,瓦片地图就是将地图根据缩放层级进行分割,例如缩放层级为3,就表明将地图分为2的3次方行和2的3次方列。知道目标位置的瓦片坐标,就可以获得相应位置的地图数据。获取地图数据很多地图服务都提供了使用http协议获取瓦片地图数据的方法。具体可以参照文末的地图瓦片url链接。这里以高德地图为例进行说明:https://webrd02.is.autonavi.co原创 2021-11-29 20:21:48 · 1305 阅读 · 0 评论 -
自学HarmonyOS应用开发(49)- 引入地图功能
秒表应用的功能就是计时,其中有一种情况就是计算地图上两点之间移动的时间。但是作者在实际使用这个应用的时候,经常会忘了在预定地点开始和停止计时。解决这个问题的想法就是为秒表应用增加预定地点自动开始和停止计时的功能。如果可能最好还能计算跑圈的时间。我们按照下面的路线图来实现这个功能: 引入地图功能 获取现在位置 在地图上选点 自动开始和停止计时 本文是第一步:借助开源项目TinyMap引入地图功能。TinyMap是董昱老师开发的鸿蒙开源项目,我们首先直接在秒表应原创 2021-11-22 20:08:37 · 938 阅读 · 0 评论 -
自学HarmonyOS应用开发(48)- Tablist组件进阶
在应用开发中经常会用到Tablist组件,连载中也介绍了该组件的基本用法:自学鸿蒙应用开发(17)- TabList和Tab但是有一个问题是这篇文章,包括HarmonyOS应用开发的官方文档都只是实现了Tab切换的基本功能,对于每个Tab页内组件的处理没有详细说明。本文就来补上这个短板。定义状态基类对于包含Tablist的AbilitySlice来讲,需要根据Tablist的选择结果切换画面组件和相应的动作处理,我们为此定义了一个SliceState基类。public abstra原创 2021-11-15 18:43:09 · 567 阅读 · 0 评论 -
自学HarmonyOS应用开发(47)- 自定义switch组件
HarmonyOS应用开发都会用到各种各样的UI组件,开发者可以根据需求在布局文件设定UI组件各种属性。但是需求是多种多样例如可以以如下方式使用switch组件:<Switch ohos:id="$+id:btn_switch" ohos:height="30vp" ohos:width="60vp" ohos:text_state_off="OFF"ohos:text_state_on="ON"/>这段代码的显示效果如下:有效状态时的表...原创 2021-11-08 19:24:24 · 478 阅读 · 0 评论 -
自学鸿蒙应用开发(46)- 处理应用前后台切换
需要长时间运行的应用不会永远保持在前台运行,用户很可能在计时的同时需要微信聊天,或者刷视频。对于秒表应用来讲就是被切换到后台。这时我们希望: 无论秒表应用处于前台还是后台,计时动作都可以继续执行。 切换到后台时秒表音频暂停播放,切回前台时继续播放音频。 以下是演示视频:46 前后台处理前后台切换通知通过重载MainAbilitySlice类的onForeground和onBackground方法可以接受应用的前、后台切换通知:@Overridepublic voi原创 2021-11-01 20:58:05 · 1224 阅读 · 0 评论 -
自学鸿蒙应用开发(45)- 播放短音频
秒表动作的同时播放音频,会更加带感。以下是效果视频:播放短视频准备音频文件秒表动作音频可以自己录制,也可以从网上寻找。得到文件之后使用音频编辑软件进行编辑,得到一个滴答滴音频文件之后将这个文件放置到项目的midia文件夹中:播放音频文件鸿蒙应用开发可以使用SoundPlayer播放音频文件:private void startSound(float speed, OnPlayListener listener) { //实例化音频播放器对象 sound原创 2021-10-25 21:55:38 · 1327 阅读 · 0 评论 -
自学鸿蒙应用开发(44)- 秒表应用开发(2)
经过几天的开发,秒表应用终于初具规模了,先看执行效果:秒表应用开发2指针式秒表组件下面是自定义指针式模拟秒表组件的实现代码。具体内容参见注释。//指针式秒表组件类public class AnalogStopWatch extends Component implements Component.DrawTask { private long start_time = 0; //计时开始时刻,毫秒单位 private long millisecond = 0;原创 2021-10-19 15:51:35 · 758 阅读 · 0 评论 -
自学鸿蒙应用开发(43)- 秒表应用开发(1)
从本篇文章开始,边学边练开发一个秒表应用,本文是本系列的第一篇:绘制表盘。先看演示视频:秒表应用开发(1)准备布局内容很简单,一个Text组件加上自定义的秒表组件。<?xml version="1.0" encoding="utf-8"?><DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:w原创 2021-10-11 20:12:20 · 1024 阅读 · 0 评论 -
自学鸿蒙应用开发(42)- 真机调试之开始调试
配置签名信息启动DevEcoStudio,打开File > Project Structure,在Modules>entry>Signing Configs > debug窗口中,配置指定模块的调试签名信息。Store File栏选择.p12文件,Profile File栏选择p7b文件,Certpath File选择cer文件;Store Password和KeyPassword栏输入之前申请证书时的密码。构建Debug Hap打开左下角的OhosBui原创 2021-10-07 20:03:16 · 622 阅读 · 0 评论 -
自学鸿蒙应用开发(41)- 真机调试之准备调试证书
生成密钥和证书请求文件本文介绍使用DevEco Studio生成密钥和证书请求文件。启动DevEco Stduio之后,通过主菜单选择Build->Generate Key and CSR。第一次进入时选择【new】。选择【KeyStoreFile】右侧的文件夹图标。选择保存目录并输入文件名。按下【OK】返回Create Store File对话框并2次输入密码之后,再次按下【OK】返回Generate Key and CSR画面。继续输入其他信息后,按下【N.原创 2021-09-27 18:51:21 · 1175 阅读 · 0 评论 -
自学鸿蒙应用开发(40)- 真机调试之准备真机
设置调试状态目前鸿蒙OS还没有正式发布,但是可以通过申请公测尝鲜。作者于4/28放假申请,5/7收到推送并升级。以下是升级成功之后的版本信息。连续点击版本号信息,画面提示【系统已经进入开发者模式】之后,从设定画面重新【系统和更新】菜单。进入画面下部的【开发人员选项】。打开【USB】调试选项之后,使用USB线连接电脑。画面提示如下:选择确定。获取udid在生成你鸿蒙真机调试时需要的profile时需要用到真机的udid,按照鸿蒙文档(参见文后链接)的说明,应原创 2021-09-23 20:21:31 · 464 阅读 · 0 评论 -
自学鸿蒙应用开发(39)- 使用多线程功能实现定时器
很多应用需要按照一定周期执行某些特定动作,本文通过一个时钟小例子介绍使用使用鸿蒙系统的多线程功能实现这一功能。以下是动作视频:demo准备布局下面的代码为了方便实现,使用TimePicker表示现在时间:<?xml version="1.0" encoding="utf-8"?><DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_p原创 2021-09-16 18:33:31 · 827 阅读 · 0 评论 -
自学鸿蒙应用开发(38)- 修改RadioButton默认动作
鸿蒙系统中RadionButton的默认动作是点击某个选项时出现选中标记,再次点击时取消选中状态,表现如下面视频中的第一排RadioButton。有时可能希望再次点击时可以维持选中状态,就像下面视频中第二排RadioButton那样。RadioButto布局文件文件中简单地放置了两个包含3个RadioButton的RadioContainer。<?xml version="1.0" encoding="utf-8"?><DirectionalLayout原创 2021-09-09 19:09:27 · 525 阅读 · 0 评论 -
自学鸿蒙应用开发(37)- PageSlider组件
PageSlider是用于页面之间切换的组件,它通过响应滑动事件完成页面间的切换。效果展示首先是本文所示代码的动作视频:PageSlider准备布局文件一共用到三个布局,第一布局是控制画面全体的page_slider_owner.xml,其内部定义了一个PageSlider组件:<?xml version="1.0" encoding="utf-8"?><PageSlider xmlns:ohos="http://schemas.huawei.co原创 2021-09-06 18:52:32 · 840 阅读 · 0 评论 -
自学鸿蒙应用开发(36)- 根据状态修改Swtich组件的文字颜色
问题描述下图是在鸿蒙应用中使用Switch组件时的状态:代码中可以使用setTextColor为组件中表示状态的文字颜色。但是问题是选中和非选中文字的颜色会同时改变。如果调查Switch的文档的话可以发现继承自AbsButton类的两个长得比较像的方法:public void setTextColorOn(Colorcolor)public void setTextColorOff(Colorcolor)但是很遗憾,目前的情况是使用这两个方法不能产生期待的效果。解决办法..原创 2021-09-02 18:55:35 · 814 阅读 · 1 评论 -
自学鸿蒙应用开发(35)- 计算UI组件相对于客户区的坐标
自定义UI组件需要处理触控操作时,需要接受触控操作的位置坐标并判断这个坐标和UI组件的位置关系。例如下图中的三个绿色正方形组件:如果使用对应组件的getLeft和getTop方法得到的坐标时该组件相对于上一级布局的坐标。而响应的触控事件的坐标则是相对整个客户区:public boolean onTouchEvent(Component component, TouchEvent touchEvent) { switch (touchEvent.getAction()) {原创 2021-08-30 18:45:03 · 669 阅读 · 0 评论