之前已经多次询问过这个问题,我已经彻底阅读并遵循了答案/评论。因此,我可以生成以下代码,但代码仅响应onDown()
,onShowPress()
,onLongPress()
。以下是我打算启用以捕获双击或双击的唯一类。
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
public class GoogleAndroidMapsActivity extends MapActivity implements OnGestureListener, OnDoubleTapListener {
private GestureDetector gestureDetector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//To allow zooming along with panning around, enable it
MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
gestureDetector = new GestureDetector(this, this);
gestureDetector.setOnDoubleTapListener(this);
mapView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("GMaps", "Double Tap");
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.d("GMaps", "Double Tap Event");
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.d("GMaps", "Single Tap Confirmed");
return true;
}
@Override
public boolean onDown(MotionEvent e) {
Log.d("GMaps", "Down");
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.d("GMaps", "Fling");
return false;
}
@Override
public void onLongPress(MotionEvent e) {
Log.d("GMaps", "Long Press");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.d("GMaps", "Scroll");
return false;
}
@Override
public void onShowPress(MotionEvent e) {
Log.d("GMaps", "Show Press");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.d("GMaps", "Single Tap Up");
return false;
}
}
但我不明白为什么onDoubleTap()
和onDoubleTapEvent()
永远不会被调用。实际上,被调用的唯一内容是onDown()
,onShowPress()
,onLongPress()
。
我甚至尝试扩展MapView,如下所示,然后在我的主类GoogleAndroidMapsActivity.java
中使用,但无济于事。我相应地更改了main.xml
以反映AdvMapView.java
。
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import com.google.android.maps.MapView;
public class AdvMapView extends MapView implements OnGestureListener, OnDoubleTapListener{
private GestureDetector gestureDetector;
public AdvMapView(Context context, AttributeSet attrSet) {
super(context, attrSet);
gestureDetector = new GestureDetector(context, this);
gestureDetector.setOnDoubleTapListener(this);
this.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("GMaps", "Double Tap");
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.d("GMaps", "Double Tap Event");
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.d("GMaps", "Single Tap Confirmed");
return false;
}
@Override
public boolean onDown(MotionEvent e) {
Log.d("GMaps", "Down");
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.d("GMaps", "Fling");
return false;
}
@Override
public void onLongPress(MotionEvent e) {
Log.d("GMaps", "Long Press");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.d("GMaps", "Scroll");
return false;
}
@Override
public void onShowPress(MotionEvent e) {
Log.d("GMaps", "Show Press");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.d("GMaps", "Single Tap Up");
return false;
}
}
然后在GoogleAndroidMapsActivity
中使用
import android.os.Bundle;
import android.view.GestureDetector;
import com.google.android.maps.MapActivity;
public class GoogleAndroidMapsActivity extends MapActivity{
private GestureDetector gestureDetector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//To allow zooming along with panning around, enable it
AdvMapView mapView = (AdvMapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
此外,onDown()
,onShowPress()
,onLongPress()
仅在我第一次点击/双击时被调用一次。在我得到“Down”,“Show Press”&在我的日志中“长按”,单击/双击无效。请帮忙。
答案 0 :(得分:0)
我是这样做的,只需将此括号放入扩展MapView类
的类主体中{
final GestureDetector gd = new GestureDetector(new SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
getController().zoomInFixing((int) e.getX(), (int) e.getY());
return true;
}
});
this.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gd.onTouchEvent(event);
}
});
}
答案 1 :(得分:0)
我遇到了完全相同的问题。具体来说,我想覆盖地图上的默认双击(SupportMapFragment)。我解决它的方式(它实际上是一种解决方法)是:
我创建了一个framelayout,它填充了与我的地图片段完全相同的区域,但之后就完全渲染了它。
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<FrameLayout
android:id="@+id/fragment_wrapper"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
然后我在“覆盖”fragment_wrapper中添加了一个手势监听器,我能够捕获双击:
GestureDetector gestureDetector = new GestureDetector(this, new DoubleTapDetector());
fragmentWrapper.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v,MotionEvent event){
gestureDetector.onTouchEvent(event);
return true;
}
});
,DoubleTapDetector类是:
public class DoubleTapDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("DoubleTapDetector", "Double Tap!");
//DO ACTIONS HERE
return true;
}
}