Wie kann ich die Ansichtsposition durch Code ändern? Wie das Ändern der X-, Y-Position. Ist es möglich?
Für alles unter Honeycomb (API Level 11) müssen Sie setLayoutParams(...)
verwenden.
Wenn Sie Ihre Unterstützung auf Honeycomb oder höher beschränken können, können Sie setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
usw. verwenden.
Ja, Sie können die Position der Ansicht in Android dynamisch festlegen. Ebenso haben Sie ein ImageView
in LinearLayout
Ihrer XML-Datei.So können Sie seine Position über LayoutParams
einstellen. Achten Sie jedoch darauf, LayoutParams
entsprechend dem in Ihrer XML-Datei.Es gibt unterschiedliche LayoutParams
je nach dem Layout genommen.
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 ist hilfreich für Sie, Position zu setzen.
Es gibt bereits verschiedene gültige Antworten, aber keine scheint richtig vorzuschlagen, welche Methode (en) in welchem Fall verwendet werden sollen, 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 den gleichen Koordinaten auf. Dies verhindert, dass 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, kann es sinnvoll sein, ausschließlich setX()
/setY()
zu verwenden.
_/Nie verwenden Sie setLeft()
setRight()
/setBottom()
/setTop()
, siehe unten.
_/Background: Die Felder mLeft
/mTop
/mBottom
/mRight
werden aus den entsprechenden LayoutParams in layout () gefüllt. Das Layout wird vom Android-Layoutsystem implizit und asynchron aufgerufen. Das Einstellen von MarginLayoutParams
scheint daher die sicherste und sauberste Methode, um die Position dauerhaft festzulegen. Die asynchrone Layoutverzögerung kann jedoch in einigen Fällen ein Problem sein, z. wenn Sie eine Ansicht verwenden, um einen Cursor zu rendern, und es soll neu positioniert werden und gleichzeitig als PopupMenu-Anker dienen. In diesem Fall funktionierte der Aufruf von layout()
gut für mich.
Die Probleme mit setLeft()
und setTop()
sind:
Ein Aufruf allein reicht nicht aus - Sie müssen auch setRight()
und setBottom()
aufrufen, um zu vermeiden, dass die Ansicht gedehnt oder verkleinert wird.
Die Implementierung dieser Methoden sieht relativ komplex aus (= einige Arbeit leisten, um die Änderungen der Ansichtsgröße zu berücksichtigen).
Sie scheinen merkwürdige 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 linken/oberen/unteren/rechten Werten behandelt, wodurch die Ansicht entsprechend verschoben wird. Sie scheinen für Animationen hinzugefügt worden zu sein (wo ein sofortiger Effekt ohne einen Layoutzyklus erforderlich ist).
Es gibt eine Bibliothek namens NineOldAndroids , mit der Sie die Honeycomb-Animationsbibliothek bis zur ersten Version verwenden können.
Dies bedeutet, dass Sie links/rechts die ÜbersetzungX/Y mit einer etwas anderen Oberfläche 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 setzen möchten.
Ich würde empfehlen, setTranslationX
und setTranslationY
zu verwenden. Ich fange gerade erst damit an, aber dies scheint die sicherste und bevorzugte Möglichkeit zu sein, eine Ansicht zu verschieben. Ich denke, es hängt sehr viel davon ab, was Sie genau tun wollen, aber das funktioniert gut 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);
Parameter y ist die visuelle y-Position dieser Ansicht.
Ich hoffe es wird dir helfen. :)
Für die Unterstützung aller API-Ebenen können Sie it wie folgt verwenden:
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
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 verwendete Layout. Andernfalls wird eine ClassCastException dann:
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 die Position der Komponente wird nicht festgelegt. Es wird nur die Position des linken Rands der Komponente festgelegt. Der Rest bleibt auf gleiche Position.
Legen Sie die linke Position dieser Ansicht relativ zum übergeordneten Element fest:
view.setLeft(int leftPosition);
Legen Sie die rechte 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 ihr übergeordnetes Element festzulegen.
Verwenden Sie RelativeLayout
, platzieren Sie Ihre Ansicht darin, rufen Sie RelativeLayout.LayoutParams
-Objekt aus Ihrer Ansicht ab und legen Sie die Ränder nach Bedarf fest. Rufen Sie dann requestLayout()
in Ihrer Ansicht auf. Nur so weiß ich es.
Ich habe festgestellt, dass @Stefan Haustein meiner Erfahrung sehr nahe kommt, aber nicht 100% sicher ist. Mein Vorschlag ist:
setLeft()
/setRight()
/setBottom()
/setTop()
funktioniert manchmal nicht.setX()
/setY()
stattdessen. (Möglicherweise möchten Sie mehr in Differenz setLeft()
und setX()
suchen.