it-swarm.com.de

Wie kann ich die Ansichtsposition in Android dynamisch einstellen?

Wie kann ich die Ansichtsposition durch Code ändern? Wie das Ändern der X-, Y-Position. Ist es möglich?

85
AB1209

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.

108
Perishable Dave

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.

42
AkashG

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 marginLeftmarginTop 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). 

22
Stefan Haustein

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.

18
Ben

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.

15
brianmearns

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. :)

11
Chickenrice

Für die Unterstützung aller API-Ebenen können Sie it wie folgt verwenden:

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
5
Orr

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.  

4
Ale Muzzi

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.

4
Balaji.K

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.

3
glodos

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.
  • Wenn Sie vorübergehend eine Position setzen möchten (z. B. zum Animieren, keine Hierarchie betroffen)), wenn die Ansicht wurde hinzugefügt und angezeigt, einfach verwenden Sie setX()/setY() stattdessen. (Möglicherweise möchten Sie mehr in Differenz setLeft() und setX() suchen.
  • Beachten Sie, dass X, Y absolut zu sein scheinen, und dies wurde von AbsoluteLayout unterstützt, das jetzt veraltet ist. Sie haben also das Gefühl, dass X, Y wahrscheinlich nicht mehr unterstützt wird. Und ja, aber nur teilweise. Dies bedeutet, wenn Ihre Ansicht hinzugefügt wird, setX (), setY () funktioniert einwandfrei; Andernfalls, wann versuchen Sie, fügen Sie eine Ansicht in das Ansichtsgruppenlayout hinzu (z. B. FrameLayout, LinearLayout, RelativeLayout), Sie müssen ihre LayoutParams mit marginLeft , marginTop stattdessen (setX (), setY () funktioniert manchmal nicht).
  • Position der Ansicht nach marginLeft und marginTop setzen ist ein unsynchronisiert-Prozess. Also braucht etwas Zeit, um die Hierarchie zu aktualisieren. Wenn Sie verwenden Sie die Ansicht sofort nach dem festgelegten Rand, erhalten Sie möglicherweise einen falschen Wert.
0
Nguyen Tan Dat