Come posso modificare la posizione di visualizzazione tramite codice? Come cambiare la sua posizione X, Y. È possibile?
Come posso modificare la posizione di visualizzazione tramite codice? Come cambiare la sua posizione X, Y. È possibile?
Risposte:
Per qualsiasi cosa al di sotto di Honeycomb (livello API 11) dovrai usare setLayoutParams(...)
.
Se è possibile limitare il vostro sostegno a nido d'ape e fino si può usare il setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, etc.
Sì, puoi impostare dinamicamente la posizione di visualizzazione in Android. Allo stesso modo hai un ImageView
in LinearLayout
del tuo file xml, quindi puoi impostarne la posizione tramite LayoutParams
.Ma assicurati di prendere in LayoutParams
base al layout preso nel tuo file xml. Ce ne sono diversi a LayoutParams
seconda del layout preso.
Ecco il codice da impostare:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
Spero che ti sarà utile impostare la posizione.
Esistono già diverse risposte valide, ma nessuna sembra suggerire correttamente quale metodo (i) utilizzare, nel qual caso, ad eccezione delle corrispondenti restrizioni a livello di API:
Se puoi attendere un ciclo di layout e il gruppo di viste padre supporta MarginLayoutParams
(o una sottoclasse), imposta marginLeft
/ di marginTop
conseguenza.
Se è necessario modificare la posizione immediatamente e in modo persistente (ad esempio per un'ancora PopupMenu), chiamare in aggiunta layout(l, t, r, b)
con le stesse coordinate. Ciò prevale su ciò che il sistema di layout confermerà in seguito.
Per modifiche immediate (temporanee) (come le animazioni), usa setX()
/ setY()
invece. Nei casi in cui la dimensione del genitore non dipende da WRAP_CHILDREN, potrebbe andare bene usare setX()
/ setY()
esclusivamente.
Non usare maisetLeft()
/ setRight()
/ setBottom()
/ setTop()
, vedi sotto.
Sfondo : i campi mLeft
/ mTop
/ mBottom
/ mRight
vengono riempiti dai LayoutParams corrispondenti in layout (). Il layout viene chiamato in modo implicito e asincrono dal sistema di layout di visualizzazione di Android. Pertanto, l'impostazione di MarginLayoutParams
sembra essere il modo più sicuro e pulito per impostare la posizione in modo permanente. Tuttavia, il ritardo del layout asincrono potrebbe essere un problema in alcuni casi, ad esempio quando si utilizza una vista per eseguire il rendering di un cursore, e dovrebbe essere riposizionato e allo stesso tempo fungere da ancoraggio PopupMenu. In questo caso, la chiamata ha layout()
funzionato bene per me.
I problemi con setLeft()
e setTop()
sono:
Chiamarli da soli non è sufficiente: devi anche chiamare setRight()
ed setBottom()
evitare di allungare o restringere la vista.
L'implementazione di questi metodi sembra relativamente complessa (= fare del lavoro per tenere conto delle modifiche alle dimensioni della vista causate da ciascuno di essi)
Sembrano causare strani problemi con i campi di input: la tastiera numerica morbida EditText a volte non consente le cifre
setX()
e setY()
lavorare al di fuori del sistema di layout, ei valori corrispondenti vengono trattati come un offset aggiuntivo rispetto ai valori sinistro / superiore / inferiore / destro determinati dal sistema di layout, spostando la vista di conseguenza. Sembra che siano stati aggiunti per le animazioni (dove è richiesto un effetto immediato senza passare attraverso un ciclo di layout).
marginLeft
può essere impostato utilizzando setLayoutParams
con a new FrameLayout.LayoutParams(width, height)
su cui si imposta ilmarginLeft
C'è una libreria chiamata NineOldAndroids , che ti consente di utilizzare la libreria di animazione Honeycomb fino alla versione uno.
Ciò significa che puoi definire sinistra, destra, translationX / Y con un'interfaccia leggermente diversa.
Ecco come funziona:
ViewHelper.setTranslationX(view, 50f);
Devi solo usare i metodi statici della classe ViewHelper, passare la vista e il valore su cui vuoi impostarla.
Consiglierei di usare setTranslationX
e setTranslationY
. Sto solo iniziando da solo, ma questo sembra essere il modo più sicuro e preferito per spostare una visualizzazione. Immagino che dipenda molto da cosa stai cercando di fare, ma per me funziona bene per l'animazione 2D.
Puoi provare a utilizzare i seguenti metodi, se stai utilizzando HoneyComb Sdk (livello API 11).
view.setX(float x);
Il parametro x è la posizione x visiva di questa vista.
view.setY(float y);
Il parametro y è la posizione y visiva di questa vista.
Spero che ti sarà utile. :)
Per il supporto a tutti i livelli API puoi usarlo in questo modo:
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
Imposta la posizione sinistra di questa vista rispetto al suo genitore:
view.setLeft(int leftPosition);
Imposta la posizione corretta di questa vista rispetto al suo genitore:
view.setRight(int rightPosition);
Imposta la prima posizione di questa vista rispetto al suo genitore:
view.setTop(int topPosition);
Imposta la posizione inferiore di questa vista rispetto al suo genitore:
view.setBottom(int bottomPositon);
I metodi precedenti vengono utilizzati per impostare la posizione della vista relativa al suo genitore.
Usa LayoutParams. Se stai usando un LinearLayout devi importare android.widget.LinearLayout.LayoutParams, altrimenti importa la versione corretta di LayoutParams per il layout che stai usando, o causerà un'eccezione ClassCastException , quindi:
LayoutParams layoutParams = new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
NB: Nota che puoi usare anche imageView.setLeft (int dim), MA QUESTO NON imposterà la posizione del componente, imposterà solo la posizione del bordo sinistro del componente, il resto rimarrà nella stessa posizione .
Ho scoperto che @Stefan Haustein si avvicina molto alla mia esperienza, ma non ne sono sicuro al 100%. Il mio suggerimento è:
setLeft()
/ setRight()
/ setBottom()
/ setTop()
a volte non funzionerà.setX()
setY()
semplicemente / invece. (Potresti voler cercare più in differenza setLeft()
esetX()
)Una cosa da tenere a mente con il posizionamento è che ogni vista ha un indice relativo alla sua vista principale. Quindi, se hai un layout lineare con tre sottoview, le sottoview avranno ciascuna un indice: 0, 1, 2 nel caso precedente.
Ciò ti consente di aggiungere una vista all'ultima posizione (o alla fine) in una vista genitore facendo qualcosa del genere:
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
In alternativa puoi sostituire una vista usando qualcosa di simile al seguente:
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.
- quindi forse non è un'idea così buona;)