我需要限制用户可以在mapview中导航到的区域(除非他们会得到一个空白的屏幕!)。 我创建了一个扩展mapview并覆盖onTouchEvent的类。 我正在检测动作“ACTION_UP”并检查此处的坐标,并在必要时重新放置地图。一切正常,直到用户“甩”地图。我可以在该点检测到“向上”和屏幕坐标,但地图仍在移动,因此我检测到的坐标不正确。
我需要知道停止移动时的屏幕位置!
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP ) {
//get coords of screen corners and calculate if the map is still in view.
}
我一直在寻找相当多的时间来回答这个问题,但很多人都在问这个问题,但似乎没有任何解决方案?
有人设法做到了吗?
Bex
答案 0 :(得分:0)
我用来覆盖MapView的computeScroll()方法:
/**
* checks restriction on pan bounds and locks the map. if the map is locked
* (via mapController.getCenter()) this method returns true
*
* @return TRUE if map has been locked
*/
private boolean restrictPanOnBounds() {
if (this.minLatitudeE6 == Integer.MIN_VALUE)
return false;
GeoPoint center = getMapCenter();
int cLat = center.getLatitudeE6();
int cLong = center.getLongitudeE6();
Integer nLat = null, nLong = null;
if (cLat < this.minLatitudeE6)
nLat = this.minLatitudeE6;
else if (cLat > this.maxLatitudeE6)
nLat = this.maxLatitudeE6;
if (cLong < this.minLongitudeE6)
nLong = this.minLongitudeE6;
else if (cLong > this.maxLongitudeE6)
nLong = this.maxLongitudeE6;
if (nLat != null || nLong != null) {
getController().setCenter(new GeoPoint(nLat != null ? nLat : cLat, nLong != null ? nLong : cLong));
return true;
} else {
return false;
}
}
@Override
public void computeScroll() {
if (restrictPanOnBounds())
getController().stopPanning();
else
super.computeScroll();
}
它适用于简单的移动动作(地图停止不会跳回)但在投掷时仍然具有“有趣”的倾斜效果......
答案 1 :(得分:0)
我遇到了同样的问题。你的方法很好,只需要在另一个地方捕捉事件。你可以覆盖&#34; DispatchTouchEvent&#34; MapView类的方法(或者使用类似的方法使用MapFragment),然后让它跳过MotionEvent.ACTION_UP事件:
if (ev.getAction() == MotionEvent.ACTION_UP ) {
return false;
}