Saya ingin membuat bentuk yang seperti gambar berikut:
Perhatikan gradien setengah atas dari warna 1 ke warna 2, tetapi ada setengah bagian bawah gradien dari warna 3 ke warna 4. Saya tahu cara membuat bentuk dengan gradien tunggal, tapi saya tidak yakin bagaimana membagi bentuk menjadi dua bagian dan membuat 1 bentuk dengan 2 gradien berbeda.
Ada ide?
Jawaban:
Saya tidak berpikir Anda bisa melakukan ini dalam XML (setidaknya tidak di Android), tetapi saya telah menemukan solusi bagus yang diposting di sini yang sepertinya akan sangat membantu!
Pada dasarnya, array int memungkinkan Anda untuk memilih beberapa pemberhentian warna, dan array float berikut menentukan posisi pemberhentian tersebut (dari 0 hingga 1). Anda kemudian dapat, seperti yang dinyatakan, cukup gunakan ini sebagai Drawable standar.
Sunting: Inilah cara Anda dapat menggunakan ini dalam skenario Anda. Katakanlah Anda memiliki Tombol yang didefinisikan dalam XML seperti:
Anda kemudian memasukkan sesuatu seperti ini di metode onCreate () Anda:
Saya tidak dapat menguji ini saat ini, ini adalah kode dari kepala saya, tetapi pada dasarnya hanya mengganti, atau menambahkan berhenti untuk warna yang Anda butuhkan. Pada dasarnya, dalam contoh saya, Anda akan mulai dengan hijau muda, memudar menjadi putih sedikit sebelum pusat (untuk memberikan memudar, daripada transisi yang keras), memudar dari putih ke hijau tengah antara 45% dan 55%, kemudian memudar dari hijau tengah ke hijau gelap dari 55% hingga akhir. Ini mungkin tidak persis seperti bentuk Anda (Saat ini, saya tidak memiliki cara untuk menguji warna-warna ini), tetapi Anda dapat memodifikasi ini untuk meniru contoh Anda.
Sunting: Juga,
0, 0, 0, theButton.getHeight()
merujuk pada koordinat gradien x0, y0, x1, y1. Jadi pada dasarnya, itu dimulai pada x = 0 (sisi kiri), y = 0 (atas), dan membentang ke x = 0 (kami menginginkan gradien vertikal, jadi tidak perlu sudut kiri ke kanan), y = tinggi dari tombol. Jadi gradien berjalan pada sudut 90 derajat dari bagian atas tombol ke bagian bawah tombol.Sunting: Oke, jadi saya punya satu ide lagi yang berfungsi, haha. Saat ini berfungsi dalam XML, tetapi harus bisa dilakukan untuk bentuk di Jawa juga. Agak kompleks, dan saya membayangkan ada cara untuk menyederhanakannya menjadi satu bentuk, tapi inilah yang saya punya untuk saat ini:
green_horizontal_gradient.xml
half_overlay.xml
layer_list.xml
test.xml
Oke, jadi pada dasarnya saya telah membuat gradien bentuk dalam XML untuk gradien hijau horizontal, ditetapkan pada sudut 0 derajat, pergi dari warna hijau kiri area atas, ke warna hijau kanan. Selanjutnya, saya membuat bentuk persegi panjang dengan abu-abu setengah transparan. Saya cukup yakin itu bisa dimasukkan ke dalam daftar lapisan XML, menghindarkan file tambahan ini, tapi saya tidak yakin bagaimana caranya. Tapi oke, maka jenis bagian hacky masuk pada file XML layer_list. Saya menempatkan gradien hijau sebagai lapisan bawah, lalu meletakkan setengah overlay sebagai lapisan kedua, diimbangi dari atas sebesar 50dp. Tentunya Anda ingin angka ini selalu setengah dari ukuran tampilan Anda, dan bukan 50dp tetap. Saya pikir Anda tidak dapat menggunakan persentase. Dari sana, saya baru saja memasukkan TextView ke tata letak test.xml saya, menggunakan file layer_list.xml sebagai latar belakang saya.
Tada!
Satu lagi edit : Saya menyadari Anda hanya bisa menanamkan bentuk ke dalam daftar layer yang dapat digambar sebagai item, artinya Anda tidak perlu 3 file XML terpisah lagi! Anda dapat mencapai hasil yang sama dengan menggabungkannya seperti:
layer_list.xml
Anda dapat melapisi item sebanyak yang Anda suka dengan cara ini! Saya dapat mencoba untuk bermain-main dan melihat apakah saya bisa mendapatkan hasil yang lebih fleksibel melalui Java.
Saya pikir ini adalah suntingan terakhir ... : Oke, jadi Anda pasti dapat memperbaiki pemosisian melalui Java, seperti berikut:
Namun! Ini mengarah ke masalah menjengkelkan lain di mana Anda tidak bisa mengukur TextView sampai setelah ditarik. Saya belum yakin bagaimana Anda bisa melakukan ini ... tetapi secara manual memasukkan nomor untuk topInset berfungsi.
Aku berbohong, satu lagi edit
Oke, temukan cara memperbarui lapisan ini secara manual agar sesuai dengan ketinggian wadah, uraian lengkap dapat ditemukan di sini . Kode ini harus masuk dalam metode onCreate () Anda:
Dan saya sudah selesai! Wah! :)
sumber
Anda bisa melapisi bentuk gradien dalam xml menggunakan lapisan-daftar. Bayangkan sebuah tombol dengan status default seperti di bawah ini, di mana item kedua semi-transparan. Ini menambahkan semacam vignetting. (Maafkan warna yang ditentukan khusus.)
sumber
Anda BISA melakukannya hanya menggunakan bentuk xml - cukup gunakan lapisan-daftar DAN lapisan negatif seperti ini:
sumber
Cobalah metode ini maka Anda dapat melakukan semua hal yang Anda inginkan.
Ini seperti tumpukan jadi hati-hati item mana yang lebih dulu atau terakhir.
sumber
Sudahkah Anda mencoba overlay satu gradien dengan opacity hampir transparan untuk highlight di atas gambar lain dengan opacity opacity untuk gradien hijau?
sumber