Android deja de enviar eventos OnTouch -- android campo con touch-event campo con ontouchlistener camp Relacionados El problema

Android stops sending onTouch events


3
vote

problema

Español

Tengo una vista personalizada para la cual deseo manejar eventos táctiles. En particular, arrastrar un dedo sobre la vista debe hacer que su contenido se desplaza. Para hacer esto, he implementado los siguientes ontouchlistener:

  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;     } };   

Esto funciona según lo esperado, a menos que el usuario mueva su dedo hacia arriba o hacia abajo mientras está en la vista. En este punto, los eventos táctiles dejan de ser enviados (como se evidencia por la falta de salida en Logcat). Sin embargo, el uso de adb shell getevent sigue siendo generado por eventos por movimiento.

¿Puede alguien sugerir cómo puedo rectificar esto?

según lo solicitado, el diseño XML se ve como:

  <?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>   
Original en ingles

I have a custom view which I wish to handle touch events for. In particular, dragging a finger over the view should cause its contents to scroll. To do this, I have implemented the following onTouchListener:

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;     } }; 

This works as expected, unless the user moves their finger up or down while on the view. At this point, touch events stop being sent (as evidenced by a lack of output in LogCat). However, using adb shell getevent still shows events being generated by touch movement.

Can anyone suggest how I can rectify this?

As requested, the layout XML looks like:

<?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> 
        
     
     

Lista de respuestas

3
 
vote

Necesitas escribir la declaración de descanso en cada caso. De lo contrario, cada caso se ejecutan.

          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;   

o puede poner en la condición de IF ... si la condición

 

you need write the break statement in each case. otherwise every case are executed.

        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; 

or you can put into the if ... else if condition

 
 
     
     
2
 
vote
vote
La mejor respuesta
 

Resulta que el problema es que la vista está contenida en un ScrollView. Eliminar el ScrollView corrige el problema.

 

It turns out the issue is that the view is contained in a ScrollView. Removing the ScrollView fixes the problem.

 
 
 
 
1
 
vote

Una forma fácil de resolver esto es crear una referencia a la vista de desplazamiento por ejemplo, MyScrollView = (ScrollView) FindViewByID (r.id.myscrollView). Luego, en OntouchEvent, Action_Down State:

myscrollView.RequestDisallowIntepTouchEvent (verdadero);

y en Action_up

myscrollView.RequestDisallowIntepTouchEvent (Falso);

 

An easy way to solve this is to create a reference to the scroll view e.g. myScrollView = (ScrollView) findViewById(R.id.myScrollView). Then in onTouchEvent, ACTION_DOWN state:

myScrollView.requestDisallowInterceptTouchEvent(true);

And in ACTION_UP

myScrollView.requestDisallowInterceptTouchEvent(false);

 
 
0
 
vote

En la parte inferior de su interruptor, intente agregar

  default:     break;   

podría no ser la solución, pero es una buena práctica tener eso.

 

At the bottom of your switch, try adding

default:     break; 

Might not be the fix, but it's good practice to have that.

 
 
 
 

Relacionados problema

0  ImageView no es touchable en una clase de vista cuando intentas dibujarlo  ( Imageview is not touchable in a view class when tried to draw on it ) 
ImageView no es touchable en una clase de vista Cuando intenté dibujarlo ... Mi problema es que cuando intento dibujar en un 9988776661 no puedo dibujarlo...

4  Android Pasando el evento táctil al contenido interno de WebView  ( Android passing touch event to webviews inner content ) 
Tengo una WebView que estoy configurando un Ontouch Listener para capturar eventos de deslizamiento en la vista real. También establece un webviewclient en ...

13  Cómo coger eventos de doble toque en Android usando OntouchListener  ( How to catch double tap events in android using ontouchlistener ) 
Estoy tratando de capturar los eventos de doble toque usando OntouchListener. Me imagino que fijaría un largo para MusseVent.Action_Down, y un largo largo par...

1  ¿Cómo mover una imagen en el diseño XML cuando el usuario en el evento Touch?  ( How to move an image on xml layout when user on touch event ) 
He implementado una solicitud con imagen. En mi solicitud, he usado en la imagen cuando el usuario toca la imagen, me gustaría mover la imagen junto con su to...

6  Play Sound mientras se presiona el botón -Android  ( Play sound while button is pressed android ) 
Tengo este código TrueClass0 y funciona pero no como lo esperaba. El sonido se reproduce, pero solo para cada vez que presiono el botón. Mi idea es. Mie...

29  OntouchEvent no funciona en las vistas infantiles  ( Ontouchevent not working on child views ) 
Tengo un diseño lineal que tiene un botón y una vista de texto en ella. He escrito un OntouchEvent para la actividad. El código funciona bien si toco en la pa...

1  Escuchando toque Events en una clase basada en Android View  ( Listening to touch events in an android view based class ) 
Cuando se deriva de una clase de android.view.view, veo 3 posibilidades para manejar eventos táctiles: Utilice el método SetonouchListener para agregar una...

123  OntouchListener ADVERTENCIA: OnTouch debe llamar a la vista # Realice una vez que se detecte un clic  ( Ontouchlistener warning ontouch should call viewperformclick when a click is d ) 
He creado un onTouchListener . Desafortunadamente ONTOUCH () MÉTODO throws ME A ADVERTENCIA: com/calculator/activitys/Calculator$1#onTouch should call ...

3  Android: setontouchlistener después de SetOnclickListener  ( Android setontouchlistener after setonclicklistener ) 
Me salte y se deslizaron hacia abajo para un diseño utilizando setontouchlistener (para comprender, consulte las imágenes a continuación) imágenes P...

226  Horizontalscrollview dentro de ScrollView Touch Manipulación  ( Horizontalscrollview within scrollview touch handling ) 
Tengo una vista de desplazamiento que rodea mi diseño completo para que toda la pantalla esté desplazada. El primer elemento que tengo en este ScrollView es u...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos