この質問は以前に何度か尋ねられており、回答/コメントをよく読んでフォローしました。その結果、以下のコードを作成できましたが、コードは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()
、最初にクリック/ダブルクリックしたときに一度だけ呼び出されます。ログに「Down」、「Show Press」、「Long Press」が表示された後、クリックまたはダブルクリックしても効果がありません。助けてください。onShowPress()
onLongPress()