2014-10-08 17 views
8

Ich habe Probleme mit dem Zeichnen von Ansichten auf anderen Bildschirmen! Ich brauche eine Methode, die zwei Parameter vom View-Typ hat. Und geben Sie true zurück, wenn sich die erste Ansicht in der zweiten Ansicht überschneidet und in einem anderen Fall false!erkennen, ob Ansichten sich überlappen

enter image description here

und

enter image description here

+0

versuchen, verschiedene Layout mit – Pr38y

+0

verwenden Sie verschiedene Layouts für verschiedene Bildschirmauflösungen? –

+0

Ich kann das Layout nicht ändern, es ist Wunsch des Kunden! – smail2133

Antwort

14

Berserk dankt Ihnen für Ihre Hilfe! Nach einigen Experimenten habe ich eine Methode geschrieben, die erkennt, dass die Ansicht überlappt ist oder nicht.

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

Gute Arbeit ... :) – berserk

+0

Bedeckt dies alle Ecken? –

+0

Ja, aber ich überprüfe es nicht. Diese Lösung ist gut für mich. Versuche es für dich. – smail2133

3

Scheinen, wie Sie Code, um Ihr Problem bitten. Ich poste die Logik, die ich denke, kann funktionieren:

  1. Erstellen Sie eine Funktion, die zwei Ansichten als Parameter und einen boolean zurückgibt.
  2. Jetzt überprüfen Sie die Position beider Ansichten auf dem Bildschirm mit this. Es wird Ihnen die Idee geben, ob sie sich überschneiden oder nicht.
  3. Geben Sie entsprechend wahr oder falsch zurück.
+0

Danke für die Beiträge, die Sie beantworten! Ich werde versuchen zu implementieren, wie du gesagt hast. Wenn die Lösung gut funktioniert, werde ich hier Code schreiben! – smail2133

10

Sie können Rect.intersect() auch verwenden, um überlappende Ansichten zu finden.

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

Das hat bei mir funktioniert, danke! – APengue

+0

Dies ist die einzige Antwort, die für mich funktioniert. Vielen Dank –

1

Dies ist ähnlich wie die Antwort von Marcel Derks, wurde aber für einen zusätzlichen Import ohne die Notwendigkeit geschrieben. Es verwendet den Basiscode, der Rect.intersect bildet, ohne die Objekte Rect zu erstellen.

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

Sie sind nicht eine Ansicht Messung zwingen erforderlich, aber es ist für eine gute Maßnahme getan;)

Verwandte Themen