Bagaimana cara mengubah posisi tampilan melalui kode? Seperti mengubah posisi X, Y nya. Apa itu mungkin?
102
Untuk apa pun di bawah Honeycomb (API Level 11), Anda harus menggunakan setLayoutParams(...)
.
Jika Anda dapat membatasi dukungan Anda untuk Honeycomb dan up Anda dapat menggunakan setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, dll
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.
- jadi mungkin itu bukan ide yang bagus;)Ya, Anda dapat mengatur posisi tampilan secara dinamis di Android. Begitu juga anda memiliki
ImageView
inLinearLayout
pada file xml anda, jadi anda bisa mengatur posisinya melaluiLayoutParams
.tapi pastikan untuk mengambilLayoutParams
sesuai dengan layout yang diambil pada file xml anda, ada yang berbedaLayoutParams
sesuai dengan layout yang diambil.Berikut kode untuk disetel:
Saya harap ini akan membantu Anda untuk mengatur posisi.
sumber
Sudah ada jawaban valid yang berbeda, tetapi tampaknya tidak ada yang menyarankan dengan tepat metode mana yang akan digunakan dalam hal ini, kecuali untuk batasan level API yang sesuai:
Jika Anda bisa menunggu siklus tata letak dan grup tampilan induk mendukung
MarginLayoutParams
(atau subclass), setelmarginLeft
/marginTop
sesuai.Jika Anda perlu mengubah posisi segera dan terus-menerus (misalnya untuk jangkar PopupMenu), panggil tambahan
layout(l, t, r, b)
dengan koordinat yang sama. Ini mendahului apa yang akan dikonfirmasi oleh sistem tata letak nanti.Untuk perubahan langsung (sementara) (seperti animasi), gunakan
setX()
/setY()
sebagai gantinya. Dalam kasus di mana ukuran induk tidak bergantung pada WRAP_CHILDREN, mungkin tidak masalah untuk menggunakansetX()
/setY()
secara eksklusif.Jangan pernah menggunakan
setLeft()
/setRight()
/setBottom()
/setTop()
, lihat di bawah.Latar belakang : Kolom
mLeft
/mTop
/mBottom
/mRight
diisi dari LayoutParams terkait di layout (). Tata letak dipanggil secara implisit dan asinkron oleh sistem tata letak tampilan Android. Dengan demikian, pengaturanMarginLayoutParams
tampaknya menjadi cara yang paling aman dan terbersih untuk mengatur posisi secara permanen. Namun, kelambatan tata letak asynchronous mungkin menjadi masalah dalam beberapa kasus, misalnya saat menggunakan View untuk merender kursor, dan seharusnya diposisikan ulang dan berfungsi sebagai jangkar PopupMenu pada saat yang sama. Dalam hal ini, meneleponlayout()
bekerja dengan baik untuk saya.Masalah dengan
setLeft()
dansetTop()
adalah:Memanggil mereka saja tidak cukup - Anda juga perlu menelepon
setRight()
dansetBottom()
untuk menghindari meregangkan atau mengecilkan tampilan.Implementasi metode ini terlihat relatif kompleks (= melakukan beberapa pekerjaan untuk memperhitungkan perubahan ukuran tampilan yang disebabkan oleh masing-masing metode)
Tampaknya menyebabkan masalah aneh dengan bidang masukan: Keyboard numerik lunak EditText terkadang tidak mengizinkan digit
setX()
dansetY()
bekerja di luar sistem tata letak, dan nilai terkait diperlakukan sebagai offset tambahan ke nilai kiri / atas / bawah / kanan yang ditentukan oleh sistem tata letak, yang menggeser tampilan sesuai kebutuhan. Mereka tampaknya telah ditambahkan untuk animasi (di mana efek langsung tanpa melalui siklus tata letak diperlukan).sumber
marginLeft
dapat diatur dengan menggunakansetLayoutParams
dengannew FrameLayout.LayoutParams(width, height)
di mana Anda mengaturmarginLeft
Ada pustaka yang disebut NineOldAndroids , yang memungkinkan Anda menggunakan pustaka animasi Honeycomb hingga versi satu.
Ini berarti Anda dapat menentukan kiri, kanan, terjemahanX / Y dengan antarmuka yang sedikit berbeda.
Berikut cara kerjanya:
Anda cukup menggunakan metode statis dari kelas ViewHelper, meneruskan tampilan dan nilai mana pun yang ingin Anda setel.
sumber
Saya akan merekomendasikan penggunaan
setTranslationX
dansetTranslationY
. Saya baru saja memulai ini sendiri, tetapi ini tampaknya cara yang paling aman dan disukai untuk memindahkan tampilan. Saya kira itu sangat tergantung pada apa yang sebenarnya Anda coba lakukan, tetapi ini bekerja dengan baik untuk saya untuk animasi 2D.sumber
Anda dapat mencoba menggunakan metode berikut, jika Anda menggunakan HoneyComb Sdk (API Level 11).
Parameter x adalah posisi x visual dari tampilan ini.
Parameter y adalah posisi visual y dari tampilan ini.
Saya harap ini akan membantu Anda. :)
sumber
Untuk dukungan untuk semua tingkat API Anda dapat menggunakan hal seperti ini:
sumber
Setel posisi kiri tampilan ini relatif terhadap induknya:
Setel posisi kanan tampilan ini relatif terhadap induknya:
Setel posisi teratas tampilan ini relatif terhadap induknya:
Setel posisi bawah tampilan ini relatif terhadap induknya:
Metode di atas digunakan untuk mengatur posisi tampilan terkait dengan induknya.
sumber
Gunakan LayoutParams. Jika Anda menggunakan LinearLayout Anda harus mengimpor android.widget.LinearLayout.LayoutParams, jika tidak impor versi LayoutParams yang tepat untuk tata letak yang Anda gunakan, atau itu akan menyebabkan ClassCastException , kemudian:
NB: Perhatikan bahwa Anda juga dapat menggunakan imageView.setLeft (int dim), TAPI INI TIDAK AKAN mengatur posisi komponen, ini hanya akan mengatur posisi batas kiri komponen, sisanya akan tetap pada posisi yang sama .
sumber
Gunakan
RelativeLayout
, letakkan tampilan Anda di dalamnya, dapatkanRelativeLayout.LayoutParams
objek dari tampilan Anda dan atur margin sesuai kebutuhan. Kemudian panggilrequestLayout()
pandangan Anda. Ini satu-satunya cara saya tahu.sumber
Saya menemukan bahwa @Stefan Haustein sangat mirip dengan pengalaman saya, tetapi tidak yakin 100%. Saran saya adalah:
setLeft()
/setRight()
/setBottom()
/setTop()
terkadang tidak berfungsi.setX()
/setY()
sebagai gantinya. (Anda mungkin ingin mencari lebih banyak perbedaansetLeft()
dansetX()
)sumber
Satu hal yang perlu diingat terkait pemosisian adalah bahwa setiap tampilan memiliki indeks yang relatif terhadap tampilan induknya. Jadi jika Anda memiliki layout linier dengan tiga subview, masing-masing subview akan memiliki indeks: 0, 1, 2 dalam kasus di atas.
Ini memungkinkan Anda menambahkan tampilan ke posisi terakhir (atau akhir) dalam tampilan induk dengan melakukan sesuatu seperti ini:
Atau Anda dapat mengganti tampilan menggunakan sesuatu seperti berikut:
sumber