33

私の方法に問題があります

@Override
public boolean onTouchEvent(MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}

呼び出されることはありません。なぜそうなのか、何か考えはありますか?GoogleのAPI4.0.3アプリケーションを構築していて、ViewFliperのスワイプを有効にしようとしています。ただし、タッチが呼び出されないため、機能しません。

コード:

 public class MainActivity extends SherlockMapActivity implements ActionBar.TabListener {

それが私の活動の宣言です。スワイプを検出するために、私はそれを実装しました:

    SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {

        float sensitvity = 50;
        if((e1.getX() - e2.getX()) > sensitvity){
            SwipeLeft();
        }else if((e2.getX() - e1.getX()) > sensitvity){
            SwipeRight();
        }

        return true;
    }

};
GestureDetector gestureDetector= new GestureDetector(simpleOnGestureListener);

ありがとうございました。

編集:

main.xml:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<ViewFlipper
    android:id="@+id/ViewFlipper"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff" >

    <include
        android:layout_height="match_parent"
        layout="@layout/mymain" />

    <include layout="@layout/secondmain" />
    <include layout="@layout/thirdmain" />
    <include layout="@layout/fourthmain" />
</ViewFlipper>
</LinearLayout>

Edit2:含まれているすべてのレイアウトにscrollviewが実装されています。スクロールがそれらのイベントを取得して処理することは可能ですか?もしそうなら、ジェスチャーを検出する方法は?

4

4 に答える 4

53

私は完璧な解決策を見つけました。新しいメソッドを実装しました:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);

そして今、それはすべてうまくいきます!

編集:

私の最終的なコード:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    View v = getCurrentFocus();
    if (v instanceof EditText) {
        View w = getCurrentFocus();
        int scrcoords[] = new int[2];
        w.getLocationOnScreen(scrcoords);
        float x = event.getRawX() + w.getLeft() - scrcoords[0];
        float y = event.getRawY() + w.getTop() - scrcoords[1];
        if (event.getAction() == MotionEvent.ACTION_UP
                && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
                        .getBottom())) {

            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                    .getWindowToken(), 0);
        }
    }
    boolean ret = super.dispatchTouchEvent(event);
    return ret;
}
于 2012-10-26T09:52:18.070 に答える
16

Gabrjanの投稿のコメントに書いたように、これは画面に触れている間も継続的に発生しますが、実際にはタッチダウンイベントのみを取得する簡単な方法があります。

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        System.out.println("TOUCH DOWN!");
        //set immersive mode here, or whatever...
    }
    return super.dispatchTouchEvent(event);
} 

これは、どの要素に関係なく、画面のいずれかの部分に触れたときにAndroidを没入型モードにするのに非常に役立ちました。しかし、私はイマーシブモードを繰り返し設定したくありませんでした!

于 2016-01-17T23:46:38.113 に答える
6

さて、問題はscrollviewハンドルがタッチすることだと確信しているので、とにかくそれを無視して、スクロールを利用できるようにしますか?

はい、それが問題です。Androidがタッチイベントを処理する場合、各イベントは子から親に移動するため、最初はViewFlipperによって処理されますが、次にScrollViewに移動します。したがって、すべてのタッチイベントをViewFlipperで処理するには、getParent()。requestDisallowInterceptTouchEvent(true)(ViewParentクラスを参照)を実装する必要があります。次に、水平の場合はジェスチャの方向を検出し、そうでない場合はビューを反転して、タッチイベントをScrollViewに渡します。または、プログラムでScrollViewをスクロールするだけです

編集:また、ViewFlipperとこのリスナートリガーGestureDetector.onTouchEvent(event)にOnTouchListenerを実装できますが、これには、親ビューのrequestDisallowInterceptTouchEventをtrueに設定する必要もあります。

于 2012-10-26T09:41:05.607 に答える
3

すべてのジェスチャとタッチイベントは、それを処理できるビュー階層の最下位の要素に移動します。したがって、含まれているレイアウトにリスナーがある場合は、必要な((TypeOfParrent)yourView.getParent()).onTouchEvent(event)ハンドラーにイベントを委任するために呼び出すことができます。

追加:ViewPagerビューを反転するために使用することをお勧めします。ViewPagerでは、独自のonGestureListenerを実装する必要はありません。

http://www.edumobile.org/android/android-beginner-tutorials/view-pager-example-in-android-development/

http://developer.android.com/reference/android/support/v4/view/ViewPager.html

于 2012-10-26T09:35:48.733 に答える