studio programacion para libros gratis edición desarrollo desarrollar aprende aplicaciones android android-view ontouchlistener

para - programacion android pdf 2018



Detectar eventos táctiles en una vista cuando se arrastra desde otra vista (6)

¿Cómo detecto el evento táctil si el usuario toca la vista A y arrastra hacia abajo sobre la vista B. Quiero detectar el evento táctil en la vista B.

Agregué el dispositivo de escucha táctil en la vista B, pero no recibo eventos si el usuario inicialmente tocó A y arrastró sobre el B.


Cuando esté sobre la Vista B, llame a onTouch manualmente.

if (viewBRect.contains(x, y)) { viewBsonTouch(view, motionEvent); }


En la View A , anule onTouchEvent siguiente manera:

@Override public boolean onTouchEvent(MotionEvent event) { float x = event.getRawX(); float y = event.getRawY(); if ( (B.getLeft() <= x <= B.getRight()) && (B.getTop() <= y <= B.getBottom()) ) { Log.i("A", "Motion Event is currently above B"); B.dispatchTouchEvent(event); } return true; }

En la View B , anule el mismo método, asegurándose de que devuelva falso :

@Override public boolean onTouchEvent(MotionEvent event) { //TODO handle touch event return false;//this will allow A to continue using the event }


Estoy seguro de que necesita reemplazar el ViewGroup.dispatchTouchEvent(MotionEvent ev) en su ViewGroup que contiene las Vistas A y B. La implementación original define la vista de destino cuando el contenedor recibe MotionEvent.getAction() == MotionEvent.ACTION_DOWN y luego se distribuye todos los siguientes eventos táctiles a la vista de destino hasta que reciba MotionEvent.getAction() == MotionEvent.ACTION_UP o MotionEvent.ACTION_CANCEL .

En su caso, la vista de destino es A o el contenedor de contenido (depende de su contenedor en la implementación del método onInterceptTouchEvent(MotionEvent ev) ). Por lo tanto, debe anular dicho comportamiento y enviar eventos táctiles no solo a la vista de destino, sino también a todas las vistas, debajo del área tocada (por ejemplo, para ver B).

Si estás interesado, puedes compartir el ejemplo de código y trataré de ayudarte.


Puede utilizar el siguiente código para realizar su solicitud:

Método para probar los límites de vista (utilizado en el código siguiente)

Rect outRect = new Rect(); int[] location = new int[2]; private boolean isViewInBounds(View view, int x, int y){ view.getDrawingRect(outRect); view.getLocationOnScreen(location); outRect.offset(location[0], location[1]); return outRect.contains(x, y); }

Pruebas con dos TextView

final TextView viewA = (TextView) findViewById(R.id.textView); final TextView viewB = (TextView) findViewById(R.id.textView2);

Vista de configuraciónA

Se requiere el OnClickListener vacío para mantener OnTouchListener activo hasta ACTION_UP

viewA.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {} }); viewA.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int x = (int)event.getRawX(); int y = (int)event.getRawY(); if(event.getAction() == MotionEvent.ACTION_UP){ if(isViewInBounds(viewB, x, y)) viewB.dispatchTouchEvent(event); else if(isViewInBounds(viewA, x, y)){ Log.d(TAG, "onTouch ViewA"); //Here goes code to execute on onTouch ViewA } } // Further touch is not handled return false; } });

Vista de configuraciónB

Esto solo es necesario si también desea presionar en viewB y arrastrar para verA

viewB.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {} }); viewB.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int x = (int)event.getRawX(); int y = (int)event.getRawY(); if(event.getAction() == MotionEvent.ACTION_UP){ if(isViewInBounds(viewA, x, y)) viewA.dispatchTouchEvent(event); else if(isViewInBounds(viewB, x, y)){ Log.d(TAG, "onTouch ViewB"); //Here goes code to execute on onTouch ViewB } } // Further touch is not handled return false; } });

Saludos.


Si está devolviendo verdadero desde el onTouchEvent de la vista A, entonces el evento no se propaga. En este caso particular, cuando A está debajo de B, devuelve falso desde onTouch de la vista A.

También ayudaría si puedes publicar algún código.


Trate de usar el marco de arrastrar y soltar.