Wie kann ich die Position der Ansicht durch Code ändern? Als würde man seine X-, Y-Position ändern. Ist es möglich?
102
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.
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;)Ja, Sie können die Ansichtsposition in Android dynamisch festlegen. Ebenso haben Sie ein
ImageView
InLinearLayout
Ihrer XML-Datei. So können Sie die Position durchLayoutParams
festlegen. Achten Sie jedoch darauf, dass SieLayoutParams
entsprechend dem in Ihrer XML-Datei aufgenommenenLayoutParams
Layout nehmen. Je nach Layout gibt es unterschiedliche Einstellungen .Hier ist der Code zum Einstellen:
Ich hoffe, es wird Ihnen hilfreich sein, die Position festzulegen.
quelle
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 SiemarginLeft
/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 niemals
setLeft()
/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. DaherMarginLayoutParams
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 Anrufenlayout()
für mich gut funktioniert.Die Probleme mit
setLeft()
undsetTop()
sind:Es reicht nicht aus, sie alleine anzurufen - Sie müssen auch anrufen
setRight()
undsetBottom()
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()
undsetY()
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).quelle
marginLeft
kann, indem mansetLayoutParams
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:
Sie verwenden einfach die statischen Methoden aus der ViewHelper-Klasse, übergeben die Ansicht und den Wert, auf den Sie sie festlegen möchten.
quelle
Ich würde empfehlen,
setTranslationX
und zu verwendensetTranslationY
. 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.quelle
Sie können versuchen, die folgenden Methoden zu verwenden, wenn Sie HoneyComb Sdk (API Level 11) verwenden.
Parameter x ist die visuelle x-Position dieser Ansicht.
Der Parameter y ist die visuelle y-Position dieser Ansicht.
Ich hoffe es wird dir hilfreich sein. :) :)
quelle
Zur Unterstützung aller API-Ebenen können Sie es folgendermaßen verwenden:
quelle
Legen Sie die linke Position dieser Ansicht relativ zum übergeordneten Element fest:
Legen Sie die richtige Position dieser Ansicht relativ zum übergeordneten Element fest:
Legen Sie die oberste Position dieser Ansicht relativ zum übergeordneten Element fest:
Legen Sie die untere Position dieser Ansicht relativ zum übergeordneten Element fest:
Die obigen Methoden werden verwendet, um die Position der Ansicht in Bezug auf das übergeordnete Element festzulegen.
quelle
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 .
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 .
quelle
Verwenden Sie
RelativeLayout
, platzieren Sie Ihre Ansicht darin, holen Sie sich einRelativeLayout.LayoutParams
Objekt aus Ihrer Ansicht und legen Sie die Ränder nach Bedarf fest. Dann rufen SierequestLayout()
Ihre Ansicht an. Dies ist der einzige Weg, den ich kenne.quelle
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()
)quelle
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:
Alternativ können Sie eine Ansicht durch Folgendes ersetzen:
quelle