我正在使用谷歌地图API,我有一些代码试图在用户拖动地图后捕捉地图中心的位置。
MapView mv = ...;
mv.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
GeoPoint pt = mv.getMapCenter();
//do something with the point
return A;
}
return B;
}
});
现在问题在于返回值:
ACTION_DOWN
事件并且永远不会触发ACTION_UP
- 我明白了ACTION_UP
事件,但地图未被拖动我想要的是接收ACTION_UP
事件并拖动地图。
我在这里缺少什么?
答案 0 :(得分:2)
这是一个解决方案:使用具有GestureDetector的自定义MapView,而不是使用默认的MapView,基本上,这可以让您为地图创建自定义事件监听器,帮助您避免弄乱拖动等问题。此外,与默认的MapView相比,您可以获得大量的交互选项。几个月前我遇到了类似的问题,所以我决定实施我刚才提到的解决方案。以下是名为TapControlledMapView的自定义MapView的代码,底部提供了自定义侦听器接口的代码:http://pastebin.com/kUrm9zFg。
因此,为了实现监听器,您需要做的就是在mapactivity类中使用以下代码(哦,如果你不知道这一点,你必须在MapActivity布局XML文件中声明以下代码,因为你是使用自定义MapView:
<?xml version="1.0" encoding="utf-8"?>
//The bottom line was the tricky business (You get ClassCastExceptions and whatnot)
<NAMEOFYOURPROJECT.TapControlledMapView (ex: com.android.googlemapsapp.TapControlledMapView)
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="API_KEY_HERE"
/>
并在MapActivity类中使用以下代码。
mapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public boolean onSingleTap(MotionEvent arg1) {
if(arg1.getAction() == MotionEvent.ACTION_UP)
{
GeoPoint pt = mv.getMapCenter();
// do something with the point.
return ***true***;
}
return true;
});
让我知道它是怎么回事。
答案 1 :(得分:0)
按照@ ViswaPatel的想法,我创建了一个新的MapView类,扩展了MapView,它覆盖了onTouchEvent
方法并管理自己的监听器:
public class CustomMapView extends MapView {
private OnTouchListener lst;
public CustomMapView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomMapView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CustomMapView(Context context, String apiKey) {
super(context, apiKey);
}
public void setOnActionUpListener(OnTouchListener lst) {
this.lst = lst;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (lst != null && event.getAction() == MotionEvent.ACTION_UP) {
lst.onTouch(this, event); // return value ignored
}
return true;
}
}
主叫代码是:
mv.setOnActionUpListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
final GeoPoint pt = mv.getMapView().getMapCenter();
//doing my stuff here
return true; //ignored anyway
}
});
}