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?

Jawaban:


535

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; 

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));

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.


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.

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

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);

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))

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);

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);

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.