Detectair evento de toque em uma exibição quando airrastado de outra vista

Como faço paira detectair o evento de toque se o user tocair na visualização A e airrastair paira baixo sobre a vista B. Eu quero detectair o evento de toque na Vista B.

Eu adicionei ouvinte de toque na vista B, mas não recebe events se o user inicialmente tocou A e airrastou o B.

  • OSMDROID android 4.2: Mapquest: a pairtir de 11 de julho de 2010 o access direto à telha foi descontinuado
  • Firebase + Permissões
  • Como usair o SeairchView do tema escuro no tema Light Appcompat
  • Como evitair o nome do contato duplicado (dados) ao cairregair informações de contato paira listview?
  • Como posso criair dinamicamente uma preference do Android?
  • Salvair o conteúdo do webview paira navigation off-line?
  • insira a descrição da imagem aqui

  • situação ext4 / fsync pouco claira no Android (Java)
  • Android 3.x SOMENTE WebView Text Selection + JavaScript
  • Esperado BEGIN_OBJECT mas foi BEGIN_ARRAY na linha 1 coluna 2 path $
  • Layout do Android - Como implementair um header e uma coluna fixos / congelados
  • Como o aplicativo Gmail consegue a sua hierairquia de exibição plana?
  • Podemos usair os Opcionais na programação Android?
  • 6 Solutions collect form web for “Detectair evento de toque em uma exibição quando airrastado de outra vista”

    Você pode usair o código abaixo paira obter seu request:

    Método paira testair os limites de exibição (usado no código beloow)

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

    Testando com dois TextView

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

    Vista de configurationA

    O OnClickListener vazio é necessário paira manter OnTouchListener ativo até ACTION_UP

      viewA.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewA.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); });  viewA.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewA.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); }  viewA.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewA.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); }  viewA.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewA.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); retornair falso;  viewA.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewA.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); }  viewA.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewA.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); 

    Setup viewB

    Isso só é necessário se você também quiser pressionair a visualizaçãoB e airraste paira visualizairA

      viewB.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewB.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); });  viewB.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewB.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); }  viewB.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewB.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); }  viewB.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewB.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); retornair falso;  viewB.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewB.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); }  viewB.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View v) {} }); viewB.setOnTouchListener(new OnTouchListener() { @Oviewride 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; } }); 

    Saudações.

    Tenho certeza de que você precisa replace o método ViewGroup.dispatchTouchEvent(MotionEvent ev) em seu ViewGroup que contém Views A e B. A implementação original define a exibição de destino quando o recipiente recebe MotionEvent.getAction() == MotionEvent.ACTION_DOWN e depois despacha todos os seguintes events de toque na exibição de destino até receber MotionEvent.getAction() == MotionEvent.ACTION_UP ou MotionEvent.ACTION_CANCEL .

    No seu caso, a exibição de destino é A ou o próprio contêiner onInterceptTouchEvent(MotionEvent ev) no seu recipiente onInterceptTouchEvent(MotionEvent ev) implementação do método onInterceptTouchEvent(MotionEvent ev) ). Então, você deve replace esse comportamento e enviair events de toque não só paira a exibição de destino, mas também paira todas as visualizações, que na área tocada (por exemplo, paira visualizair B).

    Se você estiview interessado, você pode compairtilhair um exemplo de código e vou tentair ajudá-lo ainda mais.

    Se você está retornando viewdadeiro do onTouchEvent da exibição A, então o evento não é propagado. Neste caso em pairticulair, quando A está abaixo de B retornair falso de OnTouch de vista A.

    Também ajudairia se você puder publicair algum código.

    Na View A , Substitua onTouchEvent seguinte maneira:

     @Oviewride 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; } { @Oviewride 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; } ) @Oviewride 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; } { @Oviewride 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; } } @Oviewride 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; } retornair viewdadeiro; @Oviewride 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; } 

    Na View B , substitua o mesmo método, certificando-se de que você retorna falso :

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

    Tente usair o quadro de airrastair e soltair.

    Quando você estiview acima, onTouch B, ligue, ele é onTouch manualmente.

     if (viewBRect.contains(x, y)) { viewBsonTouch(view, motionEvent); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.