Apakah ada cara di Android untuk menyesuaikan ukuran teks dalam tampilan teks agar sesuai dengan ruang yang ditempati?
Misalnya saya menggunakan a TableLayout
dan menambahkan beberapa TextView
s pada setiap baris. Karena saya tidak menginginkannyaTextView
huruf s untuk membungkus teks saya lebih suka melihat itu menurunkan ukuran font konten.
Ada ide?
Saya sudah mencoba measureText
, tetapi karena saya tidak tahu ukuran kolomnya, sepertinya sulit untuk digunakan. Ini adalah kode tempat saya ingin mengubah ukuran font menjadi sesuatu yang cocok
TableRow row = new TableRow(this);
for (int i=0; i < ColumnNames.length; i++) {
TextView textColumn = new TextView(this);
textColumn.setText(ColumnNames[i]);
textColumn.setPadding(0, 0, 1, 0);
textColumn.setTextColor(getResources().getColor(R.drawable.text_default));
row.addView(textColumn, new TableRow.LayoutParams());
}
table.addView(row, new TableLayout.LayoutParams());
Jawaban:
Solusi di bawah ini menggabungkan semua saran di sini. Dimulai dengan apa yang semula diposting oleh Dunni. Ini menggunakan pencarian biner seperti gjpc, tetapi sedikit lebih mudah dibaca. Ini juga termasuk perbaikan bug gregm dan perbaikan bug saya sendiri.
sumber
<com.example.zengame1.FontFitTextView android:paddingTop="5dip" android:id="@+id/childs_name" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:layout_gravity="center" android:textSize="@dimen/text_size"/>
float hi = this.getHeight() - this.getPaddingBottom() - this.getPaddingTop();
Saya telah menulis sebuah kelas yang memperluas TextView dan melakukan ini. Itu hanya menggunakan sizeText seperti yang Anda sarankan. Pada dasarnya ia memiliki ukuran teks maksimum dan ukuran teks minimum (yang dapat diubah) dan hanya berjalan melalui ukuran di antara mereka dalam pengurangan 1 sampai menemukan yang terbesar yang sesuai. Tidak terlalu elegan, tapi saya tidak tahu cara lain.
Ini kodenya:
sumber
Ini adalah speedplane's
FontFitTextView
, tetapi hanya mengurangi ukuran font jika diperlukan untuk membuat teks sesuai, dan mempertahankan ukuran fontnya. Itu tidak menambah ukuran font agar sesuai dengan ketinggian.Berikut adalah contoh bagaimana ini dapat digunakan dalam xml:
Ini akan menjaga ukuran font hingga 60sp selama teks sesuai lebar. Jika teks lebih panjang, itu akan mengurangi ukuran font. Dalam hal ini,
TextView
tinggi s juga akan berubah karenaheight=wrap_content
.Jika Anda menemukan bug, silakan diedit.
sumber
this.setMeasuredDimension(parentWidth, height);
match_parent
danwrap_content
.text.isEmpty()
akan"".equals(text)
.Inilah solusi saya yang bekerja pada emulator dan ponsel tetapi tidak terlalu baik pada editor layout Eclipse. Ini terinspirasi dari kode kilaka tetapi ukuran teks tidak diperoleh dari Paint tetapi dari pengukuran pemanggilan TextView sendiri
measure(0, 0)
.Kelas Java:
File atribut XML:
Periksa github saya untuk versi terbaru dari kelas ini. Semoga bermanfaat bagi seseorang. Jika bug ditemukan atau jika kode perlu dijelaskan, jangan ragu untuk membuka masalah di Github.
sumber
Terima kasih banyak untuk https://stackoverflow.com/users/234270/speedplane . Jawaban bagus!
Ini adalah versi perbaikan dari tanggapannya yang juga menjaga ketinggian dan dilengkapi dengan atribut maxFontSize untuk membatasi ukuran font (berguna dalam kasus saya, jadi saya ingin membagikannya):
File /res/values/attr.xml yang sesuai:
Contoh:
Untuk menggunakan
maxFontSize
atribut baru , jangan lupa untuk menambahkanxmlns:res-auto="http://schemas.android.com/apk/res-auto"
seperti yang ditunjukkan dalam contoh.sumber
Saya memiliki masalah yang sama dan menulis sebuah kelas yang sepertinya cocok untuk saya. Pada dasarnya, saya menggunakan tata letak statis untuk menggambar teks dalam kanvas dan pengukuran ulang yang terpisah sampai saya menemukan ukuran font yang cocok. Anda dapat melihat kelas diposting dalam topik di bawah ini. Saya harap ini membantu.
Skala Otomatis TextView Teks agar Sesuai dengan Batas
sumber
Anda sekarang dapat melakukan ini tanpa perpustakaan pihak ketiga atau widget. Ini dibangun ke dalam TextView di API level 26. Tambahkan
android:autoSizeTextType="uniform"
ke AndaTextView
dan atur ketinggiannya. Itu saja.https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
Anda juga dapat menggunakan
TextViewCompat
untuk kompatibilitas.sumber
Modifikasi sedikit ke onMeasure:
Dan pencarian biner pada refitText:
sumber
trySize *= availableWidth / measured_width
(lalu dijepit ke minTextSize).Saya menemukan yang berikut ini berfungsi dengan baik untuk saya. Itu tidak berulang dan menyumbang tinggi dan lebar. Perhatikan bahwa penting untuk menentukan unit PX saat memanggil setTextSize pada tampilan. Berkat tip di posting sebelumnya untuk ini!
Berikut ini adalah rutin yang saya gunakan, melewati getPaint () dari tampilan. String 10 karakter dengan karakter 'lebar' digunakan untuk memperkirakan lebar independen dari string sebenarnya.
sumber
Bekerja dengan modifikasi
Anda perlu mengatur ukuran tampilan teks seperti ini karena jika tidak setTextSize mengasumsikan nilainya dalam unit SP:
Dan Anda perlu menambahkan kode ini secara eksplisit.
sumber
Gunakan
app:autoSizeTextType="uniform"
untuk kompatibilitas mundur karenaandroid:autoSizeTextType="uniform"
hanya berfungsi di API Level 26 dan lebih tinggi.sumber
Saya menggunakan variasi solusi Dunni di atas, tetapi kode khusus itu tidak berfungsi untuk saya. Secara khusus, ketika mencoba menggunakan objek Paint yang diatur untuk memiliki sifat-sifat objek Paint view, dan kemudian memanggil gaugeText (), itu tidak mengembalikan nilai yang sama dengan langsung memanggil objek Paint view. Mungkin ada beberapa perbedaan dalam cara pandangan saya diatur yang membuat perilaku berbeda.
Solusi saya adalah langsung menggunakan Paint view, meskipun mungkin ada beberapa penalti kinerja dalam mengubah ukuran font untuk tampilan beberapa kali.
sumber
Saya telah bekerja untuk meningkatkan solusi luar biasa dari speedplane, dan muncul dengan ini. Ia mengatur ketinggian, termasuk mengatur margin sehingga teks harus dipusatkan dengan benar secara vertikal.
Ini menggunakan fungsi yang sama untuk mendapatkan lebar, karena tampaknya berfungsi dengan baik, tetapi menggunakan fungsi yang berbeda untuk mendapatkan ketinggian, karena ketinggian tidak disediakan di mana pun. Ada beberapa koreksi yang perlu dilakukan, tetapi saya menemukan cara untuk melakukan itu, sambil terlihat enak dipandang.
sumber
Google sudah membuat fitur ini.
https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
sumber
Saya memiliki rasa sakit ini dalam proyek saya untuk sangaaaat lama sampai saya menemukan perpustakaan ini:
Anda hanya perlu menambahkan xml dengan kebutuhan Anda dan selesai. Sebagai contoh:
sumber
Terinspirasi oleh poster sebelumnya, saya ingin membagikan solusi saya. Ini bekerja dengan faktor skala yang diterapkan pada ukuran font sebelumnya agar sesuai dengan ruang yang tersedia. Selain untuk mencegah perilaku tak terduga dari metode TextViews onDraw, itu hanya menggambar teks sendiri.
sumber
sumber
Ini harus menjadi solusi sederhana:
sumber
Perluas TextView dan timpa onDraw dengan kode di bawah ini. Ini akan menjaga rasio aspek teks tetapi ukurannya untuk mengisi ruang. Anda dapat dengan mudah memodifikasi kode untuk meregang jika perlu.
sumber
Saya menulis kelas pembantu pendek yang membuat tampilan teks pas dengan lebar tertentu dan menambahkan ellipsize "..." pada akhirnya jika ukuran teks minimum tidak dapat dicapai.
Perlu diingat bahwa itu hanya membuat teks lebih kecil sampai cocok atau sampai ukuran teks minimum tercapai. Untuk menguji dengan ukuran besar, atur ukuran teks ke angka besar sebelum memanggil metode bantuan.
Dibutuhkan Pixel, jadi jika Anda menggunakan nilai dari dimen, Anda dapat menyebutnya seperti ini:
Ini adalah kelas yang saya gunakan:
sumber
Jika tranformasi seperti allCaps diatur, pendekatan speedplane buggy. Saya memperbaikinya, menghasilkan kode berikut (maaf, reputasi saya tidak memungkinkan saya untuk menambahkan ini sebagai komentar untuk solusi speedplane):
sumber
Saya tidak tahu ini cara yang benar atau tidak, tetapi berfungsi ... ambil tampilan Anda dan periksa OnGlobalLayoutListener () dan dapatkan textview linecount kemudian atur textSize.
Beberapa kode barisnya sangat sederhana ..
sumber