自学HarmonyOS应用开发(59)- 处理拖动事件
共 2392字,需浏览 5分钟
·
2021-07-26 22:43
地图软件的一个常用功能就是地图拖动功能,本文介绍它是如何实现的。
实现DraggedListener
在Harmony应用中通过实现Component.DraggedListener接口处理拖动事件,这个接口的方法一共有6个,这里我们只是用其中的3个:
onDragPreAccept用于判断是否接受某个拖动操作,这里我们一律返回true,表示接受所有的拖动操作。
Component.DraggedListener dragListener = new Component.DraggedListener(){
public void onDragDown(Component component, DragInfo dragInfo) {
HiLog.info(LABEL, "TileMap.onDragDown!");
}
public void onDragStart(Component component, DragInfo dragInfo) {
HiLog.info(LABEL, "TileMap.onDragStart Start!");
dragStart = dragInfo.startPoint;
dragStartLocation = location;
HiLog.info(LABEL, "TileMap.onDragStart End!");
}
public void onDragUpdate(Component component, DragInfo dragInfo) {
HiLog.info(LABEL, "TileMap.onDragUpdate Start!");
Point offset = Tile.calculateOffset(512, zoom, location,
dragInfo.updatePoint.getPointX() - dragStart.getPointX(),
dragInfo.updatePoint.getPointY() - dragStart.getPointY());
location = new Location(dragStartLocation.getLatitude() - offset.getPointY(),
dragStartLocation.getLongitude() - offset.getPointX());
invalidate();
HiLog.info(LABEL, "TileMap.onDragUpdate End!");
}
public void onDragEnd(Component component, DragInfo dragInfo) {
HiLog.info(LABEL, "TileMap.onDragEnd!");
}
public void onDragCancel(Component component, DragInfo dragInfo) {
HiLog.info(LABEL, "TileMap.onDragCancel!");
}
public boolean onDragPreAccept(Component component, int dragDirection) {
return true;
}
};
开始拖动时,系统会调用onDragStart方法,在这个方法里我们可以记录一些拖动的开始信息,例如触摸位置和显示中心的经纬度信息;
在整个拖动过程中,系统会不断调用onDragUpdate方法。我们在这里获取新的触摸位置并计算这个位置和开始位置之间的移动距离,接下来将这个距离转换为经纬度偏移量并用它修正显示中心的经纬度信息。
动作效果
以下是用单指拖动地图时的显示效果:
参考代码
完整代码可以从以下链接下载:
https://github.com/xueweiguo/Harmony/tree/master/StopWatch
作者著作介绍
《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。
对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
觉得本文有帮助?请分享给更多人。
关注微信公众号【面向对象思考】轻松学习每一天!
面向对象开发,面向对象思考!