# Koordinaten eine Images feststellen



## AquaBall (18. Mai 2012)

Meine App ist nun schon sehr komplex. Nun hab ich aber ein Problem, wo ich nicht mehr weiter weiß.
Die ganze Activity entsteht dynamisch. Einige Edits, SeekBars, ...
Und unter anderem auch ImageViews, die verschoben werden können.

Das passiert in einer eigenen ausgetesteten classe.
In einem Testprogramm funktioniert die ganze klasse perfekt.

In meiner "echten" Activity passt die Funktionalität (von allen Zahlen her) auch, aber *das Image erscheint nicht am Screen*, obwohl Visibility korrekt und ist alle Werte passen. 
Allerdings irgendwo in eine FrameLayout in einem LinearLayout in einem ScrollView.
Nun ist das ganze zu komplex, um hier zu posten.

Aber anders gefragt:
*Wie kann ich die absoluten Koordinaten eines Images am Screen herausfinden?*
und 
*Wie kann ich feststellen, ob es evtl. hinter einem anderen versteckt ist?*


----------



## AquaBall (19. Mai 2012)

Ich frag nochmal:

*Wie kann ich die absoluten Koordinaten eines Images am Screen herausfinden?*
und 
*Wie kann ich feststellen, ob es evtl. hinter einem anderen versteckt ist, bzw. es dann in den Vordergrund bringen?*


----------



## AquaBall (20. Mai 2012)

Weil ich in anderem Post dazu gefragt wurde:


> Ohne Hintergrundinfo´s wem du wie dein Image addest und anzeigst, kann ich dir leider nicht weiterhelfen.




```
OnCreate() {
FrameLayout frame=new FrameLayout(this);
hauptScreen.addView(frame, barParams);
SmartBar smartBar = new SmartBar(this);		// Das ist meine (inzwischen sehr komplexe) Klasse
frame.addView(smartBar, barParams);
smartBar.setupBar(frame);   // Ruft in der Classe auf:  
-->		((ViewGroup) frame).addView(mySymbol,  lpars );
}
```


----------



## schlingel (21. Mai 2012)

Verschiebst du eine ImageView irgendwo in deiner Klasse? (Dann brauchen wir den Code dafür) Oder direkt ein Bild?


----------



## AquaBall (22. Mai 2012)

```
LayoutParams params = (LayoutParams) mySymbol.getLayoutParams();
    	params.leftMargin= newPosition;
    	mySymbol.setVisibility(View.VISIBLE);
    	mySymbol.setLayoutParams(params);
```

Ja, ich verschieb es bei OnTouch, 
Im TestProgramm funktioniert es auch, aber im "echten" Programm erscheint das Symbol nicht. (Ich vermute es wird überdeckt.)


----------



## schlingel (22. Mai 2012)

Bei einem FrameLayout liegt ja alles darüber was nach dem ImageView zum Layout hinzugefügt wurde. Hast du schon gechecked, dass hier wirklich nichts darüber liegen kann?


----------



## AquaBall (22. Mai 2012)

Das ist eigentlich so im Wesentlichen meine Frage:

Wie kann ich feststellen, was davor liegt?
und 
Wie kann ich es in den Vordergrund bringen?


----------



## MiDniGG (23. Mai 2012)

AquaBall hat gesagt.:


> Wie kann ich feststellen, was davor liegt?


Ich vermute mal, dass dies gar nicht möglich ist.


AquaBall hat gesagt.:


> Wie kann ich es in den Vordergrund bringen?


Indem Du das entsprechende View als letztes Deinem FrameLayout hinzufügst.

Die Position eines Views lässt sich übrigens mit

```
view.getLocationOnScreen(location);
```
auslesen. Der Parameter location muss ein int[] mit der größe 2 sein. In dieses werden dann die x- und y-Koordinaten geklatscht.


----------



## AquaBall (23. Mai 2012)

MiDniGG hat gesagt.:


> Indem Du das entsprechende View als letztes Deinem FrameLayout hinzufügst



Das hat geholfen!
Vielen Dank.

Ich hab mir die Verschachtelung der Layouts und Views angeschaut. (Gar nicht so einfach, weil sie ja dynamisch erstellt werden.) Und da war die Reihenfolge "falsch".
Noch komplizierter war's die Reihenfolge der Erzeugung sicherzustellen.

Bin nicht sicher, ob das in jeder Konstellation nun garantiert ist.
Kann ich ein addView() an einer gewissen Reihenfolge erzwingen?


----------



## MiDniGG (23. Mai 2012)

Naja. Die Methode addView liefert ja schon die Möglichkeit einen Index zu übergeben.

addView(child, index);

Allerdings musst Du dann halt wissen, wieviele Komponenten Du schon hast, denke ich zumindest.
In der Erklärung zu index steht:

index  the position at which to add the child 

Evtl. geht es auch, wenn Du den Index mit 9999999 setzt... Keine Ahnung. ;-)


----------

