2014-10-08 1 views
8

Ho un problema con le viste di disegno su schermi di altre dimensioni! Ho bisogno di un metodo che abbia due parametri di tipo Vista. E restituisce true se la prima vista si sovrappone alla seconda vista e falsa in un altro caso!rileva se le viste si sovrappongono

enter image description here

e

enter image description here

+0

provare a utilizzare layout diverso – Pr38y

+0

stai usando diversi layout per diverse risoluzioni dello schermo? –

+0

Non riesco a cambiare il layout, è un desiderio del cliente! – smail2133

risposta

14

Berserk ti ringrazia per l'aiuto! Dopo alcuni esperimenti ho scritto il metodo che rileva la vista è sovrapposta o no per il mio caso!

private boolean isViewOverlapping(View firstView, View secondView) { 
     int[] firstPosition = new int[2]; 
     int[] secondPosition = new int[2]; 

     firstView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 
     firstView.getLocationOnScreen(firstPosition); 
     secondView.getLocationOnScreen(secondPosition); 

     int r = firstView.getMeasuredWidth() + firstPosition[0]; 
     int l = secondPosition[0]; 
     return r >= l && (r != 0 && l != 0); 
    } 
+0

Buon lavoro ... :) – berserk

+0

Questo copre tutti gli angoli? –

+0

Sì, ma non lo controllo. Questa soluzione va bene per me. Prova per te – smail2133

3

Sembra che si sta chiedendo per il codice per il vostro problema. Sto postando la logica che penso possa funzionare:

  1. Creare una funzione che avrà due visualizzazioni come parametri e restituirà un valore booleano.
  2. Controllare ora la posizione di entrambe le visualizzazioni sullo schermo utilizzando this. Ti darà l'idea se si sovrappongono o no.
  3. Restituisce vero o falso in base ad esso.
+0

Grazie per i post che rispondi! Proverò a implementare come hai detto tu. Se la soluzione funzionerà bene, scriverò qui il codice! – smail2133

10

È inoltre possibile utilizzare Rect.intersect() per trovare viste sovrapposte.

int[] firstPosition = new int[2]; 
    int[] secondPosition = new int[2]; 

    firstView.getLocationOnScreen(firstPosition); 
    secondView.getLocationOnScreen(secondPosition); 

    // Rect constructor parameters: left, top, right, bottom 
    Rect rectFirstView = new Rect(firstPosition[0], firstPosition[1], 
      firstPosition[0] + firstView.getMeasuredWidth(), firstPosition[1] + firstView.getMeasuredHeight()); 
    Rect rectSecondView = new Rect(secondPosition[0], secondPosition[1], 
      secondPosition[0] + secondView.getMeasuredWidth(), secondPosition[1] + secondView.getMeasuredHeight()); 
    return rectFirstView.intersect(rectSecondView); 
+0

Questo ha funzionato per me, grazie! – APengue

+0

Questa è l'unica risposta che funziona per me. Grazie –

1

Questo è simile alla risposta da Marcel Derks, ma è stato scritto senza la necessità di un ulteriore importazione. Utilizza il codice di base che forma Rect.intersect senza creare gli oggetti Rect.

private boolean isViewOverlapping(View firstView, View secondView) { 
    int[] firstPosition = new int[2]; 
    int[] secondPosition = new int[2]; 

    firstView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 
    firstView.getLocationOnScreen(firstPosition); 
    secondView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 
    secondView.getLocationOnScreen(secondPosition); 

    return firstPosition[0] < secondPosition[0] + secondView.getMeasuredWidth() 
      && firstPosition[0] + firstView.getMeasuredWidth() > secondPosition[0] 
      && firstPosition[1] < secondPosition[1] + secondView.getMeasuredHeight() 
      && firstPosition[1] + firstView.getMeasuredHeight() > secondPosition[1]; 
} 

Non è necessario forzare una misura di vista, ma è fatto per buona misura;)