Cara menetapkan ukuran teks dalam nilai sp menggunakan kode java

205

Jika saya menetapkan nilai integer untuk mengubah ukuran teks tertentu dari TextViewmenggunakan kode java, nilai ditafsirkan sebagai pixel ( px).

Sekarang adakah yang tahu cara menugaskannya sp?

capecrawler
sumber

Jawaban:

535

http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29

Contoh:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
Santosh
sumber
19
Karena SP adalah singkatan dari piksel berskala Anda perlu memperkecil ukuran berdasarkan kerapatan layar. Ini mudah dilakukan sebagai berikut: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Density; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (diinginkanTextHeightInSP / SCREEN_DENSITY);
PeteH
4
Solusinya tidak bekerja untuk saya ketika saya mencoba mengumpulkan SP dari sumber daya. PeteH, Anda membuat saya di jalur yang benar! Berikut ini trik untuk saya: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Density; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers
52
Jika Anda mendapatkan ukuran sp dari sumber daya Anda, Anda harus menggunakan COMPLEX_UNIT_PX, seperti ini: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));Mendapatkan ukuran teks Anda dengan cara ini sudah akan mengonversi SP ke PX, dengan mempertimbangkan kepadatan layar dan faktor skala teks dalam akun.
Ciske Boekelo
Solusi yang disediakan bekerja untuk saya seperti yang ditunjukkan. Terima kasih!
Martin Erlic
35

Anda dapat menggunakan DisplayMetricsobjek untuk membantu mengonversi antara piksel dan piksel berskala dengan scaledDensityatribut .

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 
Dave Webb
sumber
1
Ini akan mempertimbangkan faktor penskalaan kerapatan layar tetapi bukan faktor skala teks yang mungkin ditentukan pengguna melalui pengaturan. Saya percaya solusi @ Santosh akan mempertimbangkan faktor ini sedangkan cuplikan ini tidak.
greg7gkb
3
Tetapi kadang-kadang Anda tidak dapat menggunakan metode @Santosh misalnya ketika Anda menulis Paint ke kanvas. Maka metode ini berguna dan bekerja dengan sangat baik, oleh karena itu jempol untuk kedua jawaban ini!
byemute
1
@ greg7gkb tidak benar, dokumentasi mengatakan may be adjusted in smaller increments at runtime based on a user preference for the font sizebahwa ukuran font akan diperhitungkan.
Luca Vitucci
32

Pendekatan yang lebih bersih dan lebih dapat digunakan kembali adalah

tentukan ukuran teks dalam dimens.xmlfile di dalam res/values/direktori:

</resources>
   <dimen name="text_medium">14sp</dimen>
</resources>

dan kemudian menerapkannya pada TextView:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
klimat
sumber
20

Berdasarkan pada kode sumber setTextSize:

public void setTextSize(int unit, float size) {
    Context c = getContext();
    Resources r;

    if (c == null)
        r = Resources.getSystem();
    else
        r = c.getResources();

    setRawTextSize(TypedValue.applyDimension(
        unit, size, r.getDisplayMetrics()));
}

Saya membangun fungsi ini untuk menghitung demension ke piksel:

int getPixels(int unit, float size) {
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    return (int)TypedValue.applyDimension(unit, size, metrics);
}

Di mana unit adalah sesuatu seperti TypedValue.COMPLEX_UNIT_SP.

hidup kembali
sumber
metode terakhir adalah penyelamat.
Ajibola
12

Secara default setTextSize, tanpa unit bekerja di SP (skala pixel)

public void setTextSize (float size) 
Added in API level 1
Set the default text size to the given value, interpreted as "scaled pixel" units. This 
size is adjusted based on the current density and user font size preference.
Zeus Monolitik
sumber
11

Terima kasih @John Leehey dan @PeterH:

desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);

Masalahnya adalah jika Anda mendefinisikan R.dimen.desired_sp hingga 25 di dimen.xml Anda

  1. Pada Perangkat non-HD: diinginkanSp masih 25, kepadatan = 1
  2. Pada Perangkat HD (seperti Nexus 7 2nd Generation): diinginkanSp menjadi 50 ish, densitas = 2
macio.Jun
sumber
11

Ketika jawaban yang diterima tidak berfungsi (misalnya ketika berhadapan dengan Paint), Anda dapat menggunakan:

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
pomber
sumber
ok, berhasil, itu yang saya inginkan, terima kasih pomber untuk berbagi!
Tuan Lemon
8
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))
William Hu
sumber
Tolong jelaskan bagaimana pengaturan ukuran teks sebagai nilai piksel (COMPLEX_UNIT_PX) akan sangat membantu. OP ingin "menetapkan ukuran teks dalam nilai sp"
Ya, Blau
jika Anda menggunakan, COMPLEX_UNIT_PXAnda perlu membagi kepadatan.
William Hu
Saya pikir itu karena getDimension sudah mengubah 'dp' menjadi 'px'
Ali Mousavi Kherad
3

Ini adalah kode untuk format konversi PX ke SP . 100% Bekerja

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
Kamran Gasimov
sumber
0

Setelah mencoba semua solusi dan tidak ada yang memberikan hasil yang dapat diterima (mungkin karena saya bekerja pada perangkat dengan font standar sangat besar), yang berikut ini berfungsi untuk saya (COMPLEX_UNIT_DIP = Device Independent Pixels):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
tsig
sumber
0

Dari Api level 1, Anda dapat menggunakan public void setTextSize (float size)metode ini.

Dari dokumentasi:

Tetapkan ukuran teks default ke nilai yang diberikan, ditafsirkan sebagai unit "piksel berskala". Ukuran ini disesuaikan berdasarkan kepadatan saat ini dan preferensi ukuran font pengguna.

Parameter: ukuran -> float: Ukuran piksel yang diskalakan.

Jadi Anda dapat dengan mudah melakukan:

textView.setTextSize(12); // your size in sp
pengguna2342558
sumber