地图软件的一个常用功能就是地图拖动功能,本文介绍它是如何实现的。
实现DraggedListener
在Harmony应用中通过实现Component.DraggedListener接口处理拖动事件,这个接口的方法一共有6个,这里我们只是用其中的3个:
onDragPreAccept用于判断是否接受某个拖动操作,这里我们一律返回true,表示接受所有的拖动操作。
代码语言:javascript复制Component.DraggedListener dragListener = new Component.DraggedListener(){
@Override
public void onDragDown(Component component, DragInfo dragInfo) {
HiLog.info(LABEL, "TileMap.onDragDown!");
}
@Override
public void onDragStart(Component component, DragInfo dragInfo) {
HiLog.info(LABEL, "TileMap.onDragStart Start!");
dragStart = dragInfo.startPoint;
dragStartLocation = location;
HiLog.info(LABEL, "TileMap.onDragStart End!");
}
@Override
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!");
}
@Override
public void onDragEnd(Component component, DragInfo dragInfo) {
HiLog.info(LABEL, "TileMap.onDragEnd!");
}
@Override
public void onDragCancel(Component component, DragInfo dragInfo) {
HiLog.info(LABEL, "TileMap.onDragCancel!");
}
@Override
public boolean onDragPreAccept(Component component, int dragDirection) {
return true;
}
};
开始拖动时,系统会调用onDragStart方法,在这个方法里我们可以记录一些拖动的开始信息,例如触摸位置和显示中心的经纬度信息;
在整个拖动过程中,系统会不断调用onDragUpdate方法。我们在这里获取新的触摸位置并计算这个位置和开始位置之间的移动距离,接下来将这个距离转换为经纬度偏移量并用它修正显示中心的经纬度信息。
动作效果
以下是用单指拖动地图时的显示效果:
参考代码
完整代码可以从以下链接下载:
https://github.com/xueweiguo/Harmony/tree/master/StopWatch