Wie kann ich die Position der Ansicht durch Code ändern? Als würde man seine X-, Y-Position ändern. Ist es möglich?
Wie kann ich die Position der Ansicht durch Code ändern? Als würde man seine X-, Y-Position ändern. Ist es möglich?
Antworten:
Für alles unter Honeycomb (API Level 11) müssen Sie verwenden setLayoutParams(...)
.
Wenn Sie Ihre Unterstützung für Honeycomb begrenzen und bis Sie verwenden können , die setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, usw.
Ja, Sie können die Ansichtsposition in Android dynamisch festlegen. Ebenso haben Sie ein ImageView
In LinearLayout
Ihrer XML-Datei. So können Sie die Position durch LayoutParams
festlegen. Achten Sie jedoch darauf, dass Sie LayoutParams
entsprechend dem in Ihrer XML-Datei aufgenommenen LayoutParams
Layout nehmen. Je nach Layout gibt es unterschiedliche Einstellungen .
Hier ist der Code zum Einstellen:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
Ich hoffe, es wird Ihnen hilfreich sein, die Position festzulegen.
Es gibt bereits verschiedene gültige Antworten, aber keine scheint richtig vorzuschlagen, welche Methode (n) in welchem Fall verwendet werden soll (sind), mit Ausnahme der entsprechenden Einschränkungen auf API-Ebene:
Wenn Sie auf einen Layoutzyklus warten können und die übergeordnete Ansichtsgruppe MarginLayoutParams
(oder eine Unterklasse) unterstützt, setzen Sie marginLeft
/ marginTop
entsprechend.
Wenn Sie die Position sofort und dauerhaft ändern müssen (z. B. für einen PopupMenu-Anker), rufen Sie zusätzlich layout(l, t, r, b)
mit denselben Koordinaten auf. Dies setzt voraus, was das Layoutsystem später bestätigt.
Verwenden Sie für sofortige (vorübergehende) Änderungen (z. B. Animationen) stattdessen setX()
/ setY()
. In Fällen, in denen die übergeordnete Größe nicht von WRAP_CHILDREN abhängt, ist es möglicherweise in Ordnung, setX()
/ setY()
ausschließlich zu verwenden.
Verwenden Sie niemalssetLeft()
/ setRight()
/ setBottom()
/ setTop()
, siehe unten.
Hintergrund : Die Felder mLeft
/ mTop
/ mBottom
/ mRight
werden von den entsprechenden LayoutParams in layout () ausgefüllt. Das Layout wird vom Android-Ansichtslayoutsystem implizit und asynchron aufgerufen. Daher MarginLayoutParams
scheint das Einstellen von die sicherste und sauberste Möglichkeit zu sein, die Position dauerhaft einzustellen. In einigen Fällen kann die asynchrone Layoutverzögerung jedoch ein Problem darstellen, z. B. wenn Sie eine Ansicht zum Rendern eines Cursors verwenden. Sie soll neu positioniert werden und gleichzeitig als PopupMenu-Anker dienen. In diesem Fall hat das Anrufen layout()
für mich gut funktioniert.
Die Probleme mit setLeft()
und setTop()
sind:
Es reicht nicht aus, sie alleine anzurufen - Sie müssen auch anrufen setRight()
und setBottom()
vermeiden, dass die Ansicht gedehnt oder verkleinert wird.
Die Implementierung dieser Methoden sieht relativ komplex aus (= einige Arbeiten ausführen, um die durch jede von ihnen verursachten Änderungen der Ansichtsgröße zu berücksichtigen)
Sie scheinen seltsame Probleme mit Eingabefeldern zu verursachen: Die weiche numerische EditText-Tastatur lässt manchmal keine Ziffern zu
setX()
und setY()
arbeiten außerhalb des Layoutsystems, und die entsprechenden Werte werden als zusätzlicher Versatz zu den vom Layoutsystem festgelegten Werten für links / oben / unten / rechts behandelt, wodurch die Ansicht entsprechend verschoben wird. Sie scheinen für Animationen hinzugefügt worden zu sein (wo ein sofortiger Effekt erforderlich ist, ohne einen Layoutzyklus zu durchlaufen).
marginLeft
kann, indem man setLayoutParams
mit einem verwendet, new FrameLayout.LayoutParams(width, height)
auf dem man denmarginLeft
Es gibt eine Bibliothek namens NineOldAndroids , mit der Sie die Honeycomb-Animationsbibliothek bis zur ersten Version verwenden können.
Dies bedeutet, dass Sie left, right, translationX / Y mit einer etwas anderen Schnittstelle definieren können.
So funktioniert es:
ViewHelper.setTranslationX(view, 50f);
Sie verwenden einfach die statischen Methoden aus der ViewHelper-Klasse, übergeben die Ansicht und den Wert, auf den Sie sie festlegen möchten.
Ich würde empfehlen, setTranslationX
und zu verwenden setTranslationY
. Ich fange gerade erst selbst damit an, aber dies scheint die sicherste und bevorzugte Art zu sein, eine Ansicht zu verschieben. Ich denke, es hängt sehr davon ab, was genau Sie versuchen, aber das funktioniert gut für mich für 2D-Animationen.
Sie können versuchen, die folgenden Methoden zu verwenden, wenn Sie HoneyComb Sdk (API Level 11) verwenden.
view.setX(float x);
Parameter x ist die visuelle x-Position dieser Ansicht.
view.setY(float y);
Der Parameter y ist die visuelle y-Position dieser Ansicht.
Ich hoffe es wird dir hilfreich sein. :) :)
Zur Unterstützung aller API-Ebenen können Sie es folgendermaßen verwenden:
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
Legen Sie die linke Position dieser Ansicht relativ zum übergeordneten Element fest:
view.setLeft(int leftPosition);
Legen Sie die richtige Position dieser Ansicht relativ zum übergeordneten Element fest:
view.setRight(int rightPosition);
Legen Sie die oberste Position dieser Ansicht relativ zum übergeordneten Element fest:
view.setTop(int topPosition);
Legen Sie die untere Position dieser Ansicht relativ zum übergeordneten Element fest:
view.setBottom(int bottomPositon);
Die obigen Methoden werden verwendet, um die Position der Ansicht in Bezug auf das übergeordnete Element festzulegen.
Verwenden Sie LayoutParams. Wenn Sie ein LinearLayout verwenden, müssen Sie android.widget.LinearLayout.LayoutParams importieren. Andernfalls importieren Sie die richtige Version von LayoutParams für das von Ihnen verwendete Layout. Andernfalls wird eine ClassCastException ausgelöst .
LayoutParams layoutParams = new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
NB: Beachten Sie, dass Sie auch imageView.setLeft (int dim) verwenden können, ABER DIESES wird NICHT die Position der Komponente festlegen, sondern nur die Position des linken Randes der Komponente, der Rest bleibt an derselben Position .
Ich fand, dass @Stefan Haustein meiner Erfahrung sehr nahe kommt, aber nicht 100% sicher ist. Mein Vorschlag ist:
setLeft()
/ setRight()
/ setBottom()
/ setTop()
Wird manchmal nicht funktionieren.setX()
setY()
setLeft()
setX()
)Bei der Positionierung ist zu beachten, dass jede Ansicht einen Index relativ zu ihrer übergeordneten Ansicht hat. Wenn Sie also ein lineares Layout mit drei Unteransichten haben, haben die Unteransichten jeweils einen Index: 0, 1, 2 im obigen Fall.
Auf diese Weise können Sie der letzten Position (oder dem Ende) in einer übergeordneten Ansicht eine Ansicht hinzufügen, indem Sie Folgendes tun:
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
Alternativ können Sie eine Ansicht durch Folgendes ersetzen:
int childIndex = parentView.indexOfChild(childView);
childView.setVisibility(View.GONE);
parentView.addView(newView, childIndex);
sets the top position of this view relative to its parent. This method is meant to be called by the layout system and should not generally be called otherwise, because the property may be changed at any time by the layout.
- vielleicht ist das keine so gute Idee;)