我需要检测 MapView 何时滚动或缩放,例如 javascript API 中的“moveend”事件。我想等到视图停止移动,这样我就可以检测是否需要向服务器查询查看矩形内的项目,如果需要,则发出请求。 (实际上我发送了一个比查看矩形稍大的区域的请求)
显然,如果视图仍在移动,我宁愿不发送数据请求。但更糟糕的是,我不知道我需要发送另一个请求,导致地图上的区域丢失标记。
目前,我正在子类化 MapView 并处理 onTouchEvent,如下所示:
public boolean onTouchEvent(android.view.MotionEvent ev) {
super.onTouchEvent (ev);
if (ev.getAction() == MotionEvent.ACTION_UP) {
GeoPoint center = getMapCenter();
int latSpan = getLatitudeSpan(), lngSpan = getLongitudeSpan();
/* (check if it has moved enough to need a new set of data) */
}
return true;
}
问题是,我不知道视图是否已停止,因为滚动往往具有惯性并且可以继续经过“ACTION_UP”事件。
是否有一些我可以点击的事件会在地图视图完成移动(或缩放)时提醒我?如果没有,有人编写逻辑来检测这一点吗?理论上,我可以通过查看所有操作来进行猜测,并设置一些稍后出现的内容并检查它......但是......这看起来很混乱并且是 PITA。但如果有人已经写了......:)
这是我目前正在使用的方法,我已经使用过并测试过,效果很好。
只要确保你做了你的draw()
方法高效。 (避免其中GC)。
//In map activity
class MyMapActivity extends MapActivity {
protected void onCreate(Bundle savedState){
setContent(R.layout.activity_map);
super.onCreate(savedSate);
OnMapMoveListener mapListener = new OnMapMoveListener(){
public void mapMovingFinishedEvent(){
Log.d("MapActivity", "Hey look! I stopped scrolling!");
}
}
// Create overlay
OnMoveOverlay mOnMoveOverlay = new OnMoveOverlay(mapListener);
// Add overlay to view.
MapView mapView = (MapView)findViewById(R.id.map_view);
// Make sure you add as the last overlay so its on the top.
// Otherwise other overlays could steal the touchEvent;
mapView.getOverlays().add(mOnMoveOverlay);
}
}
这是您的 OnMoveOverlay 类
//OnMoveOverlay
class OnMoveOverlay extends Overlay
{
private static GeoPoint lastLatLon = new GeoPoint(0, 0);
private static GeoPoint currLatLon;
// Event listener to listen for map finished moving events
private OnMapMoveListener eventListener = null;
protected boolean isMapMoving = false;
public OnMoveOverlay(OnMapMoveListener eventLis){
//Set event listener
eventListener = eventLis;
}
@Override
public boolean onTouchEvent(android.view.MotionEvent ev)
{
super.onTouchEvent(ev);
if (ev.getAction() == MotionEvent.ACTION_UP)
{
// Added to example to make more complete
isMapMoving = true;
}
//Fix: changed to false as it would handle the touch event and not pass back.
return false;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow)
{
if (!shadow)
{
if (isMapMoving)
{
currLatLon = mapView.getProjection().fromPixels(0, 0);
if (currLatLon.equals(lastLatLon))
{
isMapMoving = false;
eventListener.mapMovingFinishedEvent();
}
else
{
lastLatLon = currLatLon;
}
}
}
}
public interface OnMapMoveListener{
public void mapMovingFinishedEvent();
}
}
只需实现你自己的监听器eventListener.mapMovingFinishedEvent();
并通过上面的另一种方法触发地图移动布尔并进行排序。
这个想法是,当地图移动时,像素投影到坐标将会改变,一旦它们相同,你就完成了移动。
我已经用更新的更完整的代码更新了它,它的双重绘制存在问题。
我们不对阴影通道做任何事情,因为我们只是对每个绘制通道进行双重计算,这是一种浪费。
随意问任何问题 :)
谢谢,
克里斯
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)