4 Stimmen

Android sendet keine onTouch-Ereignisse mehr

Ich habe eine benutzerdefinierte Ansicht, die ich Touch-Ereignisse für behandeln möchte. Insbesondere sollte das Ziehen eines Fingers über die Ansicht dazu führen, dass der Inhalt gescrollt wird. Um dies zu tun, habe ich den folgenden onTouchListener implementiert:

private OnTouchListener graphOnTouchListener = new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        System.out.println("onTouch called");
        System.out.println("view width: " + v.getWidth());
        System.out.println("view height: " + v.getHeight());
        System.out.println("view: " + v);

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                // First finger down
                System.out.println("ACTION_DOWN x: " + event.getX() + ", y: " + event.getY());
                startTouch(event.getX());
                break;
            case MotionEvent.ACTION_UP:
                // Last finger to be removed
                System.out.println("ACTION_UP x: " + event.getX() + ", y: " + event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                // A finger moves
                System.out.println("ACTION_MOVE x: " + event.getX() + ", y: " + event.getY());
                moveTouch(event.getX());
                break;
            default:
                break;
        }  

        // The event has been handled, so return true
        return true;
    }
};

Dies funktioniert wie erwartet, es sei denn, der Benutzer bewegt seinen Finger nach oben oder unten, während er sich in der Ansicht befindet. An diesem Punkt werden keine Berührungsereignisse mehr gesendet (was durch eine fehlende Ausgabe in LogCat belegt wird). Allerdings ist die Verwendung von adb shell getevent zeigt immer noch Ereignisse, die durch Berührungsbewegungen ausgelöst werden.

Kann mir jemand vorschlagen, wie ich dieses Problem beheben kann?

Wie gewünscht, sieht das Layout-XML wie folgt aus:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#ffffff">
    <FrameLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <ScrollView android:layout_width="fill_parent"
            android:layout_height="fill_parent" android:padding="10dip">
            <LinearLayout android:layout_width="fill_parent"
                android:layout_height="fill_parent" android:orientation="vertical">
                <com.graphlib.ShaderAreaGraphView
                    android:layout_width="fill_parent" android:layout_height="200dip"
                    android:id="@+id/activity_power_realtime" android:background="#000000" />
                <LinearLayout android:layout_width="fill_parent" android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:gravity="center">
                    <Button android:text="&lt;&lt;" android:id="@+id/goBackwardsButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
                    <Button android:text="Zoom out" android:id="@+id/zoomOutButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
                    <Button android:text="Zoom in" android:id="@+id/zoomInButton" android:layout_width="wrap_content" android:layout_height="wrap_content" ></Button>
                    <Button android:text="&gt;&gt;" android:id="@+id/goForwardsButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
                </LinearLayout>
            </LinearLayout>
        </ScrollView>
    </FrameLayout>
</LinearLayout>

3voto

Pratik Punkte 30577

Sie müssen die Break-Anweisung in jedem Fall schreiben, sonst wird jeder Fall ausgeführt.

        case MotionEvent.ACTION_DOWN:
            // First finger down
            System.out.println("ACTION_DOWN x: " + event.getX() + ", y: " + event.getY());
            startTouch(event.getX());
            break;
        case MotionEvent.ACTION_UP:
            // Last finger to be removed
            System.out.println("ACTION_UP x: " + event.getX() + ", y: " + event.getY());
            break;
        case MotionEvent.ACTION_MOVE:
            // A finger moves
            System.out.println("ACTION_MOVE x: " + event.getX() + ", y: " + event.getY());
            moveTouch(event.getX());
            break;

oder Sie können in die Bedingung if ... else if einfügen

2voto

Tim Timmingson Punkte 61

Es stellt sich heraus, dass das Problem darin besteht, dass die Ansicht in einer ScrollView enthalten ist. Das Entfernen der ScrollView behebt das Problem.

1voto

Lumis Punkte 21217

Eine einfache Lösung besteht darin, einen Verweis auf die Bildlaufansicht zu erstellen, z. B. myScrollView = (ScrollView) findViewById(R.id.myScrollView). Dann in onTouchEvent, ACTION_DOWN Zustand:

myScrollView.requestDisallowInterceptTouchEvent(true);

Und in ACTION_UP

myScrollView.requestDisallowInterceptTouchEvent(false);

0voto

NujnaH Punkte 173

Versuchen Sie, am unteren Ende Ihres Schalters Folgendes hinzuzufügen

default:
    break;

Vielleicht ist das nicht die Lösung, aber es ist eine gute Übung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X