3

この質問は以前に何度か尋ねられており、回答/コメントをよく読んでフォローしました。その結果、以下のコードを作成できましたが、コードは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()

4

2 に答える 2

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);
  }
});
}
于 2013-01-22T21:55:01.250 に答える
0

私はまったく同じ問題を抱えていました。具体的には、マップ (SupportMapFragment) でのデフォルトのダブルタップをオーバーライドしたかったのです。私がそれを解決した方法(実際には回避策です)は次
のとおりです。マップフラグメントとまったく同じ領域を埋めるフレームレイアウトを作成しましたが、その後正確にレンダリングされました。

<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;
    }
}
于 2013-02-13T17:41:59.337 に答える