我有Activity
扩展MapActivity
。我使用谷歌地图
我需要通过双击或双击放大。
有人可以帮我这个吗?
我已经看过下面的内容了,但它们并不是我想要的。
Double Tap -> Zoom on Android MapView?
Fling gesture detection on grid layout
我意识到onTouchListener
只被调用一次,为什么会这样?
// set Gesture
detector = new GestureDetector(new GestureReactor());
mapView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
System.out.println("Inside onTouch");
return detector.onTouchEvent(event);
}
});
我有私人课程:
private class GestureReactor extends SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
System.out.println("inside onDouble");
controller.zoomInFixing((int) e.getX(), (int) e.getY());
return super.onDoubleTap(e);
}
}
和
private GestureDetector detector;
答案 0 :(得分:3)
由于您需要复制粘贴答案,请查看here。
编辑:
在我的public class MainMap extends MapActivity
我有一个名为private MyMapView mv;
然后我创建了一个扩展MapView
的类,如下所示:
public class MyMapView extends MapView
。
因此,您只需创建一个extends MapView
的新课程,复制粘贴在此处链接中找到的代码,然后在您的class
<。活动中使用新的extends MapActivity
。 / p>
答案 1 :(得分:3)
答案 2 :(得分:3)
我喜欢这种使用自定义视图扩展MapView并在整个应用程序中使用它的解决方案。 MapView具有拦截触摸手势的功能,您可以使用它来执行双击伏都教。如果您的应用程序中有多个地图,这是保持DRY的好方法。
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import com.google.android.maps.MapView;
public class MyMapView extends MapView {
private long lastTouchTime = -1;
public MyMapView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
long thisTime = System.currentTimeMillis();
if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) {
// Double tap
this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
lastTouchTime = -1;
} else {
// Too slow :)
lastTouchTime = thisTime;
}
}
return super.onInterceptTouchEvent(ev);
}
}
来自this guy
答案 3 :(得分:3)
我和bbodenmiller有同样的问题,一切正常,直到我不得不施展到新制作的课程。 mapView =(MyMapView)findViewById(R.id.mapview);会一直抛出异常。
解决方案是更改我们显示自定义MapView的XML布局。当您使用vanilla MapView时,您的XML布局是这样的:
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.maps.MapView
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="Hidden for obvious reasons"
/>
问题在于“com.google.android.maps.MapView”将视图定义为MapView。您需要使用自定义的MapView来定义它。最终看起来更像这样。
<?xml version="1.0" encoding="utf-8"?>
<jocquej.PackageName.MyMapView
...
/>
答案 4 :(得分:3)
我一直在寻找答案/示例,但发现无处可用的代码。
最后,这是适合我的代码:
<强> MyMapActivity.java 强>
public class MyMapActivity extends MapActivity implements OnGestureListener,
OnDoubleTapListener{
private MapView mapView;
@Override
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView)findViewById(R.id.mapView);
}
@Override
public boolean onDoubleTap(MotionEvent e) {
int x = (int)e.getX(), y = (int)e.getY();;
Projection p = mapView.getProjection();
mapView.getController().animateTo(p.fromPixels(x, y));
mapView.getController().zoomIn();
return true;
}
//Here will be some autogenerated methods too
<强> OnDoubleTap.java 强>
public class OnDoubleTap extends MapView {
private long lastTouchTime = -1;
public OnDoubleTap(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
long thisTime = System.currentTimeMillis();
if (thisTime - lastTouchTime < 250) {
// Double tap
this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
lastTouchTime = -1;
} else {
// Too slow
lastTouchTime = thisTime;
}
}
return super.onInterceptTouchEvent(ev);
}
}
<强> main.xml中强>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<azizbekyan.andranik.map.OnDoubleTap
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="YOUR_API_KEY" />
</LinearLayout>
不要忘记在此处用android:apiKey
替换apiKey
值。
答案 5 :(得分:0)
我无法让http://nocivus.posterous.com/double-clicktap-detection-on-a像许多其他人一样工作,因为它不允许我施放mapView = (MyMapView) findViewById(R.id.mapview);
被称为我得到的最佳解决方案是基于{{3}的答案}:
myLocationOverlay = new MyLocationOverlay(this, mapView);
MyItemizedOverlay itemizedOverlay = new MyItemizedOverlay() {
private long systemTime = System.currentTimeMillis();
@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if ((System.currentTimeMillis() - systemTime) < ViewConfiguration.getDoubleTapTimeout()) {
mapController.zoomInFixing((int) event.getX(), (int) event.getY());
}
break;
case MotionEvent.ACTION_UP:
systemTime = System.currentTimeMillis();
break;
}
return false;
}
};