1

AndroidのDoubleTapでMohanからの回答を使用していますが、実装方法がわかりません。

私は webView を持っていて、左右からのスワイプとダブルタップを検出したいと考えています。一度に両方を実装するにはどうすればよいですか。ジェスチャが初めてなので助けてください。

4

2 に答える 2

2

これを試して、

private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;

gestureDetector = new GestureDetector(new MyGestureDetector());
    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (gestureDetector.onTouchEvent(event)) {
                return true;
            }
            return false;
        }
    };

MyGestureDetector

class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            // right to left swipe
            if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

// あなたのコード

            } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

// あなたのコード

            }
        } catch (Exception e) {
            Log.e(LOG_TAG, "onFling", e);

        }
        return false;
    }
}

スワイプ距離を調べると、なんとなくタッチとスワイプの区別がつきます。これがお役に立てば幸いです。

于 2012-03-20T08:11:04.367 に答える
0

これは、独自のジェスチャを処理する拡張された WebView です。これは、外側の UI 領域がジェスチャを吸収し、リスナーを取り込むのに苦労していることに気付いた人を助けるかもしれません。それが私の問題でした。これは、独自のスワイプとダブル whatsits をすべて検出する WebView です。

package org.this_voice.modabrowser;

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.webkit.WebView;
import android.widget.Toast;

public class MoDaView extends WebView implements
    GestureDetector.OnDoubleTapListener {

Context mContext;
GestureDetector gestureDetector = new GestureDetector(
        new mGestureDetector());

public MoDaView(Context context) {
    super(context);
    mContext = context;
    gestureDetector.setOnDoubleTapListener(this);
    gestureDetector.setIsLongpressEnabled(true);
}

public MoDaView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mContext = context;
    gestureDetector.setOnDoubleTapListener(this);
    gestureDetector.setIsLongpressEnabled(true);
}

public MoDaView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mContext = context;
    gestureDetector.setOnDoubleTapListener(this);
    gestureDetector.setIsLongpressEnabled(true);
}

private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;

class mGestureDetector extends SimpleOnGestureListener {

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
            float distanceX, float distanceY) {
        return super.onScroll(e1, e2, distanceX, distanceY);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
            return false;
         // right to left swipe
            if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Toast.makeText(mContext, "Left Swipe", Toast.LENGTH_SHORT)
                    .show();
            } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Toast.makeText(mContext, "Right Swipe", Toast.LENGTH_SHORT)
                    .show();
            }
        } catch (Exception e) {
            // nothing
        }
        return false;
    }

}

public boolean onTouchEvent(MotionEvent event) {
    return gestureDetector.onTouchEvent(event) || super.onTouchEvent(event);
}

@Override
public boolean onDoubleTap(MotionEvent event) {
    Toast.makeText(mContext, "onDoubleTap", Toast.LENGTH_SHORT).show();
    return true;
}

@Override
public boolean onDoubleTapEvent(MotionEvent event) {
    Toast.makeText(mContext, "onDoubleTapEvent", Toast.LENGTH_SHORT).show();
    return true;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
    Toast.makeText(mContext, "onSingleTapConfirmed", Toast.LENGTH_SHORT)
        .show();
    return true;
}
}

拡張された WebView を使用するクラスのセットアップは次のとおりです。

wv = (MoDaView) findViewById(R.id.webview);
wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
WebSettings wvOptions = wv.getSettings();
wvOptions.setJavaScriptEnabled(true);
wvOptions.setGeolocationEnabled(false);
wvOptions.setBuiltInZoomControls(true);
wvOptions.setUseWideViewPort(true);

これは、上記のすべてのジェスチャーを検出しています。このクラスは、stackoverflow からの約 6 つの異なる回答を組み合わせていることを付け加えておきます。

もう1つ、私が経験したことを人々を救うために。ダブルタップは 2 本指のタップではありません。だと思いました(長い話、スキップします)。ダブルタップとは、1 本の指ですばやく 2 回タップすることです。そして、2 本の指は同時に 2 つです。これが私が言及する理由です。すべての電話がそれを検出できるわけではありません。私はそれを使うつもりでしたが、今は実際のダブルタップに行きます. Android には 2 本指ジェスチャーを「偽装」するための 2 つのクラスがありますが、これらのクラスはどこでも機能するとは限りません。参考までに。

于 2013-04-04T22:27:45.357 に答える