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.