Saya membutuhkan 2 cara untuk menampilkan label vertikal di Android:
- Label horizontal diputar 90 derajat berlawanan arah jarum jam (huruf di samping)
- Label horizontal dengan huruf satu di bawah yang lain (seperti tanda toko)
Apakah saya perlu mengembangkan widget khusus untuk kedua kasus (satu kasus), dapatkah saya membuat TextView untuk dirender seperti itu, dan cara apa yang baik untuk melakukan hal seperti itu jika saya harus sepenuhnya menyesuaikan?
android
label
textview
vertical-alignment
Bostone
sumber
sumber
Jawaban:
Ini adalah implementasi teks vertikal saya yang elegan dan sederhana, memperluas TextView. Ini berarti bahwa semua gaya standar TextView dapat digunakan, karena ini merupakan TextView yang diperluas.
Secara default, teks yang diputar dari atas ke bawah. Jika Anda menyetel android: gravity = "bottom", maka itu digambar dari bawah ke atas.
Secara teknis, itu menipu TextView yang mendasari untuk berpikir bahwa itu adalah rotasi normal (menukar lebar / tinggi di beberapa tempat), sambil menggambarnya diputar. Ini berfungsi dengan baik juga saat digunakan dalam tata letak xml.
EDIT: memposting versi lain, di atas bermasalah dengan animasi. Versi baru ini bekerja lebih baik, tetapi kehilangan beberapa fitur TextView, seperti marquee dan spesialisasi serupa.
EDIT versi Kotlin:
sumber
TextView
. Sebenarnya tautan digarisbawahi, tetapi tidak merespons saat diklik.Saya menerapkan ini untuk proyek ChartDroid saya . Buat
VerticalLabelView.java
:Dan di
attrs.xml
:sumber
Salah satu cara untuk mencapainya adalah:
sumber
\n
setelah setiap karakter atau jika Anda memiliki font dengan lebar tetap, batasi lebar TextView agar pas hanya dengan satu karakter.Mencoba kedua kelas VerticalTextView dalam jawaban yang disetujui, dan mereka bekerja dengan cukup baik.
Tapi apa pun yang saya coba, saya tidak dapat memposisikan VerticalTextView tersebut di tengah layout yang memuatnya (RelativeLayout yang merupakan bagian dari item yang digelembungkan untuk RecyclerView).
FWIW, setelah melihat-lihat, saya menemukan kelas VerticalTextView yoog568 di GitHub:
https://github.com/yoog568/VerticalTextView/blob/master/src/com/yoog/widget/VerticalTextView.java
yang dapat saya posisikan sesuai keinginan. Anda juga perlu menyertakan definisi atribut berikut dalam proyek Anda:
https://github.com/yoog568/VerticalTextView/blob/master/res/values/attr.xml
sumber
Ini berhasil untuk saya, baik-baik saja. Adapun huruf vertikal turun - saya tidak 'tahu.
sumber
Ada beberapa hal kecil yang perlu diperhatikan.
Itu tergantung pada charset saat memilih cara memutar atau jalur. Misalnya, jika kumpulan karakter target adalah bahasa Inggris, dan efek yang diharapkan terlihat seperti,
Anda bisa mendapatkan efek ini dengan menggambar setiap karakter satu per satu, tidak perlu memutar atau jalur.
Anda mungkin perlu memutar atau jalur untuk mendapatkan efek ini.
bagian yang sulit adalah ketika Anda mencoba membuat charset seperti Mongolian. mesin terbang di Typeface perlu diputar 90 derajat, jadi drawTextOnPath () akan menjadi kandidat yang baik untuk digunakan.
sumber
Mengikuti jawaban Pointer Null , saya dapat memusatkan teks secara horizontal dengan memodifikasi
onDraw
metode seperti ini:Anda mungkin perlu menambahkan sebagian TextView measureWidth untuk memusatkan teks multilined.
sumber
Anda bisa menambahkan ke TextView atau nilai rotasi xml View lainnya. Ini adalah cara termudah dan bagi saya bekerja dengan benar.
sumber
Pendekatan awal saya untuk merender teks vertikal di dalam LinearLayout vertikal adalah sebagai berikut (ini Kotlin, dalam penggunaan Java,
setRoatation
dll.):Seperti yang Anda lihat, masalahnya adalah TextView berjalan secara vertikal tetapi masih memperlakukan lebarnya seolah-olah diorientasikan secara horizontal! = /
Jadi pendekatan # 2 terdiri dari tambahan lebar dan tinggi secara manual untuk memperhitungkan ini:
Namun ini mengakibatkan label membungkus ke baris berikutnya (atau dipotong jika Anda
setSingleLine
) setelah lebar yang relatif pendek. Sekali lagi, ini bermuara pada membingungkan x dengan y.Pendekatan saya # 3 dengan demikian adalah membungkus TextView dalam RelativeLayout. Idenya adalah untuk mengizinkan TextView dengan lebar apa pun yang diinginkan dengan memperluasnya jauh ke kiri dan kanan (di sini, 200 piksel di kedua arah). Tapi kemudian saya memberikan margin negatif RelativeLayout untuk memastikannya digambar sebagai kolom sempit. Ini kode lengkap saya untuk tangkapan layar ini:
Sebagai tip umum, strategi memiliki tampilan "tahan" tampilan lain ini sangat berguna bagi saya dalam memposisikan sesuatu di Android! Misalnya, jendela info di bawah ActionBar menggunakan taktik yang sama!
Untuk teks yang muncul seperti tanda toko cukup masukkan baris baru setelah setiap karakter, misalnya
"N\nu\nt\ns"
akan menjadi:sumber
Saya menyukai pendekatan @ kostmo. Saya memodifikasinya sedikit, karena saya mengalami masalah - memotong label yang diputar secara vertikal ketika saya menetapkan parameternya sebagai
WRAP_CONTENT
. Jadi, teks tidak sepenuhnya terlihat.Beginilah cara saya menyelesaikannya:
Jika Anda ingin memiliki teks dari atas ke bawah, gunakan
topToDown(true)
metode.sumber