26

ユーザーがクリックしたときに何かをする必要がありImageButtonます OnClickListenerOnTouchListener

static class ClickListenerForScrolling implements OnClickListener, OnTouchListener 

次のメソッドがあります。

@Override
public void onClick(View v)

@Override
public boolean onTouch(View arg0, MotionEvent arg1)

この背後にある全体的な考え方はImageButton、ユーザーがタッチしたときにの画像ソースを変更し、ユーザーがこのボタンをクリックしたときにタスクを実行することです。誰でもこれを行う方法についてのヒントを教えてもらえますか?

4

5 に答える 5

36

どちらのアクションも「画面に指を置く - 画面から指を離す」というジェスチャで構成されているため、それがタッチ アクションなのかクリック アクションなのかを判断することはできません。したがって、この画像ボタンに両方のリスナーを実装すると、タッチ/クリックで画像が変更され、ボタンが押されます。これらのイベントの順序が決まっているかどうかはわかりません...

ただし、これらのイベントを分離したい場合は、アクションの 1 つに別のジェスチャを定義する (ワイプして画像を変更するなど) か、イベントを処理する別の領域を作成する必要があります (たとえば、画像が収まらないなど)。ボタン全体と空き領域がボタンクリック領域として機能します。

HTH

アップデート:

aTouchEventは a よりも一般的であるClickEventため、最初に呼び出されることがわかりました。

public abstract boolean onTouch (View v, MotionEvent event)

これは、リスナーがイベントを消費した場合は true を返し、それ以外の場合は false を返します。そのため、イベントも OnClickListener で処理する必要があるかどうかを実装で決定できますfalse

于 2012-07-20T12:12:18.220 に答える
13

onTouchListener両方の動きを処理できます。

Switchevent.action()取得する値の間MotionEvent

case MotionEvent.ACTION_DOWN: 最初の指の影響です。
case MotionEvent.ACTION_UP:指が離れたときです。

に着弾点を設定する必要がありますACTION_DOWN

TheImpactPoint=event.getX();

そして、距離を取得しますACTION_UP

float distance =TheImpactPoint-event.getX();

If distance = 0それ以外の場合は、ジェスチャに応じてゼロより大きいか小さいかになります。

したがって、これは、実際のクリック イベントを使用せずにonTouchListener.

希望は役に立ちます。

于 2013-03-05T22:14:30.260 に答える
11

次のコードを使用します。

public class GestureHelper implements OnTouchListener {

private final GestureDetector mGestureDetector;

public GestureHelper(Context context) {
    mGestureDetector = new GestureDetector(context, new GestureListener(this));
}

public void onSwipeRight() {
};

public void onSwipeLeft() {
};

public void onSwipeTop() {
};

public void onSwipeBottom() {
};

public void onDoubleTap() {
};

public void onClick() {
};

@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}

private static final class GestureListener extends SimpleOnGestureListener {

    private static final int SWIPE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;
    private GestureHelper mHelper;

    public GestureListener(GestureHelper helper) {
        mHelper = helper;
    }

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

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        mHelper.onClick();
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        mHelper.onDoubleTap();
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                        mHelper.onSwipeRight();
                    } else {
                        mHelper.onSwipeLeft();
                    }
                }
            } else {
                if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        mHelper.onSwipeBottom();
                    } else {
                        mHelper.onSwipeTop();
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return result;
    }
}

}

このクラスを拡張して、次のように使用します...

view.setOnTouchListener(new SomeYourGestureHelper(context, someParameters));
于 2014-05-26T10:29:27.127 に答える
6

return falseの代わりに使用return true

于 2015-07-13T09:03:51.740 に答える