Apakah mungkin untuk mencapai margin negatif pada tata letak batasan untuk mencapai tumpang tindih? Saya mencoba untuk memiliki gambar yang berpusat pada tata letak dan memiliki tampilan Teks sedemikian rupa sehingga tumpang tindih dengan x dp. Saya mencoba menetapkan nilai margin negatif tetapi tidak berhasil. Akan sangat bagus jika ada cara untuk mencapai ini.
118
Jawaban:
Klarifikasi: Jawaban di bawah ini tetap valid, tetapi saya ingin mengklarifikasi beberapa hal. Solusi asli akan menempatkan tampilan dengan ofset negatif de facto sehubungan dengan tampilan lain seperti yang dinyatakan dan akan muncul dalam tata letak seperti yang ditunjukkan.
Solusi lain adalah dengan menggunakan properti translationY seperti yang disarankan oleh Amir Khorsandi di sini . Saya lebih suka solusi yang lebih sederhana dengan satu peringatan: Terjemahan terjadi pasca-tata letak , sehingga tampilan yang dibatasi ke tampilan yang dipindahkan tidak akan mengikuti terjemahan.
Misalnya, XML berikut menampilkan dua TextView tepat di bawah gambar. Setiap tampilan dibatasi dari atas ke bawah dengan tampilan yang muncul tepat di atasnya.
Sekarang, mari kita menerjemahkan "Katakanlah nama saya" TextView oleh
50dp
dengan menentukanIni menghasilkan yang berikut:
TextView "Say my name" telah bergeser ke atas seperti yang diharapkan, tetapi TextView "Say it" tidak mengikuti seperti yang kita harapkan. Ini karena terjemahan terjadi setelah tata letak . Meskipun tampilan berpindah tata letak pasca, itu masih bisa dibuat dapat diklik di posisi baru.
Jadi, IMO, gunakan translationX dan translationY untuk margin negatif di ConstraintLayout jika peringatan di atas tidak memengaruhi tata letak Anda; jika tidak, gunakan widget luar angkasa seperti yang dijelaskan di bawah ini.
Jawaban asli
Meskipun tampaknya margin negatif tidak akan didukung
ConstraintLayout
, ada cara untuk mencapai efek menggunakan alat yang tersedia dan didukung. Berikut adalah gambar di mana judul gambar tumpang tindih22dp
dari bagian bawah gambar - secara efektif menjadi-22dp
margin:Ini dilakukan dengan menggunakan
Space
widget dengan margin bawah sama dengan offset yang Anda inginkan. TheSpace
widget kemudian memiliki bagian bawahnya dibatasi untuk bagian bawahImageView
. Sekarang yang perlu Anda lakukan adalah membatasi bagian atasTextView
dengan judul gambar ke bagian bawahSpace
widget. IniTextView
akan diposisikan di bagian bawahSpace
tampilan dengan mengabaikan margin yang telah ditetapkan.Berikut ini adalah XML yang menyelesaikan efek ini. Saya akan mencatat bahwa saya menggunakan
Space
karena ringan dan ditujukan untuk jenis penggunaan ini, tetapi saya dapat menggunakan jenis lainView
dan membuatnya tidak terlihat. (Anda mungkin perlu melakukan penyesuaian.) Anda juga dapat menentukan aView
dengan margin nol dan tinggi margin sisipan yang Anda inginkan, dan membatasi bagian atasTextView
ke atas insetView
.Namun pendekatan lain akan melapisi bagian
TextView
atasImageView
dengan menyelaraskan bagian atas / bawah / kiri / kanan dan membuat penyesuaian yang sesuai pada margin / padding. Manfaat dari pendekatan yang ditunjukkan di bawah ini adalah bahwa margin negatif dapat dibuat tanpa banyak perhitungan. Itu semua untuk mengatakan bahwa ada beberapa cara untuk mendekati ini.Pembaruan: Untuk diskusi singkat dan demo teknik ini, lihat posting blog Google Developers Medium .
Margin Negatif untuk
ConstraintLayout
XMLsumber
ImageView
berpusat pada orang tua,TextView
tumpang tindih di atasImageView
. KemudianSpace
membuat kesalahan saat Aplikasi kembali dari latar belakang. Saya pikir 0dp, 0dp membuat masalah. Bagaimana dengan penggunaan sajaGuideline
.Cara lain adalah menggunakan
translationX
atautranslationY
seperti ini:itu akan bekerja seperti
android:layout_marginRight="-25dp"
sumber
Ikuti dua masalah ini:
https://code.google.com/p/android/issues/detail?id=212499 https://code.google.com/p/android/issues/detail?id=234866
sumber
Inilah yang saya temukan setelah berjam-jam mencoba menemukan solusi.
Mari kita pertimbangkan dua gambar, gambar1 dan gambar2. Image2 harus ditempatkan di atas image1 yang diposisikan ke sisi kanan bawah.
Contoh Tampilan Tumpang Tindih
Kita bisa menggunakan Space widget untuk tampilan yang tumpang tindih.
Batasi empat sisi widget Space dengan empat sisi image1 masing-masing. Untuk contoh ini, batasi sisi kiri gambar2 dengan sisi kanan widget Space dan sisi atas gambar2 dengan sisi bawah widget Space. Ini akan mengikat image2 dengan widget Space dan karena widget Space dibatasi dari semua sisi, kita dapat menentukan bias horizontal atau vertikal yang diperlukan yang akan memindahkan image2 sesuai kebutuhan.
Selain itu, untuk memposisikan gambar2 di tengah-bawah gambar1, kita dapat membatasi sisi kiri dan kanan gambar2 dengan sisi kiri dan kanan widget Space. Demikian pula, kita dapat menempatkan gambar2 di mana saja dengan mengubah batasan gambar2 dengan widget Space.
sumber
Saya menemukan cara untuk melakukannya lebih sederhana.
Pada dasarnya memiliki ImageView, kemudian pada Text View tambahkan batasan teratas agar sesuai dengan batasan teratas gambar dan cukup tambahkan margin atas TextView agar sesuai untuk mencapai perilaku tipe margin -ve.
sumber
Ini akan membantu banyak orang
Dalam kasus saya, saya ingin desain saya seperti ini:
Berarti saya ingin gambar saya ditampilkan setengah dari lebarnya sehingga pada dasarnya saya membutuhkan margin negatif setengah dari lebar gambar sebenarnya tetapi seluruh tata letak saya dalam tata letak batasan dan tata letak batasan tidak mengizinkan margin negatif jadi saya mencapai ini dengan kode di bawah ini
Sehingga ImageView akan berakhir di awal pedoman. dan efeknya sama seperti margin negatif di awal 50dp.
Dan juga jika lebar tampilan Anda tidak tetap dan dalam persentase sehingga Anda dapat menempatkan pedoman dengan persentase dan mencapai efek apa pun yang Anda inginkan
Selamat Coding :)
sumber
Anda hanya perlu menggunakan widget Space di tata letak Anda
sumber
Ini adalah pertanyaan lama namun sangat banyak ditanyakan, cara tercepat untuk mencapai ini adalah dengan membatasi bagian atas dan bawah ke sisi tampilan yang ingin Anda jangkar, seperti:
Ini akan memusatkannya di garis bawah tampilan, di tengah secara horizontal.
sumber
Cara yang Sederhana.
Saya tidak yakin cara terbaik.
Cukup bungkus menggunakan LinearLayout
sumber