Görünüm konumunu kod aracılığıyla nasıl değiştirebilirim? X, Y konumunu değiştirmek gibi. Mümkün mü?
Görünüm konumunu kod aracılığıyla nasıl değiştirebilirim? X, Y konumunu değiştirmek gibi. Mümkün mü?
Yanıtlar:
Honeycomb'un (API Seviye 11) altındaki her şey için kullanmanız gerekecek setLayoutParams(...)
.
Honeycomb'dan için desteğinizi sınırlamak ve eğer kullanabilirsiniz yukarı setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, vb
Evet, görünümün konumunu Android'de dinamik olarak ayarlayabilirsiniz. Aynı şekilde bir var ImageView
içinde LinearLayout
senin xml aracılığıyla onun konumunu ayarlayabilirsiniz file.So LayoutParams
.Ama almak için emin olun LayoutParams
sizin xml file.There alınan düzenine göre farklıdır LayoutParams
alınan düzenine göre.
İşte ayarlanacak kod:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
Umarım pozisyon belirlemeniz size yardımcı olur.
Halihazırda farklı geçerli yanıtlar var, ancak karşılık gelen API düzeyi kısıtlamaları dışında hiçbiri bu durumda hangi yöntemlerin kullanılacağını doğru bir şekilde önermiyor gibi görünüyor:
Bir düzen döngüsünü bekleyebilirseniz ve üst görünüm grubu MarginLayoutParams
(veya bir alt sınıfı) destekliyorsa , buna göre marginLeft
/ ayarlayın marginTop
.
Konumu hemen ve ısrarla değiştirmeniz gerekirse (örneğin bir PopupMenu bağlantısı için), ek layout(l, t, r, b)
olarak aynı koordinatlarla arayın . Bu, düzen sisteminin daha sonra onaylayacağı şeyi önceden belirler.
Anlık (geçici) değişiklikler için (animasyonlar gibi) bunun yerine setX()
/ setY()
kullanın. Ebeveyn boyutunun WRAP_CHILDREN'e bağlı olmadığı durumlarda, özel olarak setX()
/ kullanmak iyi olabilir setY()
.
AslasetLeft()
/ setRight()
/ setBottom()
/ kullanmayın setTop()
, aşağıya bakın.
Arka plan : mLeft
/ mTop
/ mBottom
/ mRight
alanları, layout () içindeki karşılık gelen LayoutParams'tan doldurulur. Düzen, Android görünüm düzeni sistemi tarafından örtülü ve eşzamansız olarak çağrılır. Bu nedenle, MarginLayoutParams
konumu kalıcı olarak ayarlamanın en güvenli ve en temiz yolu gibi görünüyor. Bununla birlikte, eşzamansız düzen gecikmesi bazı durumlarda bir sorun olabilir, örneğin bir imleci oluşturmak için bir Görünüm kullanıldığında ve yeniden konumlandırılması ve aynı zamanda bir PopupMenu bağlantısı olarak hizmet etmesi gerekir. Bu durumda aramalayout()
benim için iyi çalıştı.
Sorunlar setLeft()
ve setTop()
şunlardır:
Onları tek başına aramak yeterli değildir - ayrıca aramanız setRight()
ve setBottom()
görünümü uzatmaktan veya küçültmekten kaçınmanız gerekir .
Bu yöntemlerin uygulanması nispeten karmaşık görünüyor (= her birinin neden olduğu görünüm boyutu değişikliklerini hesaba katmak için biraz çalışma yapmak)
Giriş alanlarında garip sorunlara neden oluyor gibi görünüyorlar: EditText yumuşak sayısal klavye bazen rakamlara izin vermiyor
setX()
ve setY()
yerleşim sisteminin dışında çalışır ve karşılık gelen değerler, görünümü buna göre kaydırarak, yerleşim sistemi tarafından belirlenen sol / üst / alt / sağ değerlere ek bir sapma olarak kabul edilir. Animasyonlar için eklenmiş gibi görünüyorlar (bir düzen döngüsünden geçmeden hemen bir efektin gerekli olduğu yerlerde).
marginLeft
kullanılarak ayarlanabilir setLayoutParams
bir ile new FrameLayout.LayoutParams(width, height)
hangi ayarladığınızmarginLeft
Honeycomb animasyon kütüphanesini birinci versiyona kadar kullanmanıza izin veren NineOldAndroids adlı bir kütüphane var .
Bu, biraz farklı bir arayüzle sol, sağ, translationX / Y'yi tanımlayabileceğiniz anlamına gelir.
Şu şekilde çalışır:
ViewHelper.setTranslationX(view, 50f);
ViewHelper sınıfındaki statik yöntemleri kullanırsınız, görünümü iletirsiniz ve onu hangi değere ayarlamak isterseniz iletirsiniz.
Ben kullanarak öneriyoruz setTranslationX
ve setTranslationY
. Buna kendim daha yeni başlıyorum, ancak bunlar bir manzarayı hareket ettirmenin en güvenli ve tercih edilen yolu gibi görünüyor. Sanırım bu, tam olarak ne yapmaya çalıştığınıza bağlı, ancak bu benim için 2D animasyon için iyi çalışıyor.
HoneyComb Sdk (API Seviye 11) kullanıyorsanız, aşağıdaki yöntemleri kullanmayı deneyebilirsiniz.
view.setX(float x);
Parametre x, bu görünümün görsel x konumudur.
view.setY(float y);
Parametre y, bu görünümün görsel y konumudur.
Umarım size yardımcı olur. :)
Tüm API seviyelerine destek için kullanabileceğiniz bunu böyle:
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
Bu görünümün sol konumunu üstüne göre ayarlayın:
view.setLeft(int leftPosition);
Üstüne göre bu görünümün doğru konumunu ayarlayın:
view.setRight(int rightPosition);
Üstüne göre bu görünümün en üst konumunu ayarlayın:
view.setTop(int topPosition);
Bu görünümün alt konumunu üstüne göre ayarlayın:
view.setBottom(int bottomPositon);
Yukarıdaki yöntemler, görünümü ebeveyniyle ilgili konumu ayarlamak için kullanılır.
LayoutParams'ı kullanın. Bir LinearLayout kullanıyorsanız android.widget.LinearLayout.LayoutParams'ı içe aktarmanız gerekir, aksi takdirde kullandığınız düzen için LayoutParams'in uygun sürümünü içe aktarmanız gerekir, aksi takdirde bir ClassCastException'a neden olur , o zaman:
LayoutParams layoutParams = new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
Not: imageView.setLeft (int dim) 'i de kullanabileceğinizi unutmayın, ANCAK BU, bileşenin konumunu ayarlamaz, yalnızca bileşenin sol kenarının konumunu ayarlayacaktır, geri kalanı aynı konumda kalacaktır .
@Stefan Haustein'ın deneyimime çok yaklaştığını, ancak% 100 emin olamadığını öğrendim. Benim önerim şu:
setLeft()
/ setRight()
/ setBottom()
/ setTop()
bazen çalışmaz.setX()
/setY()
yerine. (Daha fazla farklı arama yapmak isteyebilirsiniz vesetLeft()
setX()
)Konumlandırmayla ilgili akılda tutulması gereken bir şey, her görünümün üst görünümüne göre bir dizine sahip olmasıdır. Dolayısıyla, üç alt görünüm içeren doğrusal bir düzene sahipseniz, alt görünümlerin her birinin bir indeksi olacaktır: yukarıdaki durumda 0, 1, 2.
Bu, aşağıdaki gibi bir şey yaparak bir üst öğe görünümündeki son konuma (veya sona) bir görünüm eklemenizi sağlar:
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
Alternatif olarak, aşağıdaki gibi bir şey kullanarak bir görünümü değiştirebilirsiniz:
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.
- belki bu o kadar da iyi bir fikir değil;)