जावा कोड का उपयोग करके एसपी मूल्य में पाठ का आकार कैसे निर्दिष्ट करें


205

यदि मैं एक TextViewजावा कोड का उपयोग करके एक निश्चित पाठ आकार बदलने के लिए एक पूर्णांक मान प्रदान करता हूं , तो मूल्य को पिक्सेल ( px) के रूप में व्याख्या किया जाता है ।

अब क्या किसी को पता है कि इसे कैसे सौंपा जाए sp?

जवाबों:


535

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

उदाहरण:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

18
चूंकि एसपी स्केल किए गए पिक्सेल के लिए है, इसलिए आपको स्क्रीन घनत्व द्वारा आकार कम करना होगा। यह आसानी से निम्नानुसार किया जाता है: SCREEN_DENSITY = getResources ()। GetDisplayMetrics (), घनत्व। yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (इच्छितTeHeightInSP / SCREEN_DENSITY);
PeteH

4
जब मैंने एसपी को संसाधनों से इकट्ठा करने की कोशिश की तो समाधान मेरे काम नहीं आया। PeteH, आपने मुझे सही रास्ते पर ले लिया! निम्नलिखित ने मेरे लिए चाल चली: ... float textSize = getResources ()। GetDimension (R.dimen.textsize) / getResources ()। GetDisplayMetrics () घनत्व; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
पी कूइजपर्स

52
यदि आपको अपने संसाधनों से सपा आकार मिलता है, तो आपको COMPLEX_UNIT_PX का उपयोग करना चाहिए, इस तरह: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));अपने पाठ का आकार प्राप्त करना इस तरह से पहले से ही एसपी को पीएक्स में परिवर्तित कर देगा, स्क्रीन घनत्व और पाठ स्केल कारक दोनों को ध्यान में रखेगा।
Ciske Boekelo

प्रदान किए गए समाधान ने मेरे लिए काम किया जैसा कि दिखाया गया है। धन्यवाद!
मार्टिन एरिक

35

आप किसी DisplayMetricsऑब्जेक्ट को scaledDensityविशेषता के साथ पिक्सेल और स्केल किए गए पिक्सेल के बीच कनवर्ट करने में मदद करने के लिए उपयोग कर सकते हैं ।

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 

1
यह स्क्रीन डेंसिटी स्केलिंग फैक्टर को ध्यान में रखेगा लेकिन टेक्स्ट स्केल फैक्टर नहीं जिसे उपयोगकर्ता सेटिंग्स के माध्यम से निर्दिष्ट कर सकता है। मेरा मानना ​​है कि @ संतोष का समाधान इस कारक को ध्यान में रखेगा जबकि यह स्निपेट नहीं करता है।
greg7gkb

3
लेकिन कभी-कभी आप कैनवास में पेंट लिखते समय उदाहरण के लिए @ संतोष की विधि का उपयोग करने में सक्षम नहीं होते हैं। तब यह विधि काम आती है और बहुत अच्छी तरह से काम करती है, इसलिए इन दो उत्तरों के लिए अंगूठे!
byemute

1
@ greg7gkb सत्य नहीं है, दस्तावेज़ीकरण कहता may be adjusted in smaller increments at runtime based on a user preference for the font sizeहै कि फ़ॉन्ट आकार को ध्यान में रखा जाएगा।
लुका विटुचि

32

क्लीनर और अधिक पुन: प्रयोज्य दृष्टिकोण है

निर्देशिका के dimens.xmlअंदर फ़ाइल में पाठ का आकार परिभाषित करें res/values/:

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

और फिर इसे लागू करें TextView:

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

20

के स्रोत कोड के आधार पर 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()));
}

मैं पिक्सल के लिए किसी भी तनाव को शांत करने के लिए इस फ़ंक्शन का निर्माण करता हूं:

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

कहाँ इकाई की तरह कुछ है TypedValue.COMPLEX_UNIT_SP


अंतिम विधि एक जीवन रक्षक है।
अजीबोला

12

डिफ़ॉल्ट रूप से setTextSize, बिना इकाइयों के सपा में काम करते हैं (स्केल पिक्सेल)

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

धन्यवाद @ जॉन लीही और @ पेटरएच:

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

बात यह है कि यदि आप अपने dimen.xml में R.dimen.desired_sp से 25 को परिभाषित करते हैं

  1. गैर-एचडी डिवाइस पर: वांछित गति अभी भी 25 है, घनत्व = 1
  2. HD डिवाइस पर (Nexus 7 2nd Generation की तरह): वांछित 50 ish, घनत्व = 2 हो जाता है

11

जब स्वीकृत उत्तर काम नहीं करता है (उदाहरण के लिए जब पेंट से निपटने के लिए) तो आप उपयोग कर सकते हैं:

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);

ठीक है, यह काम करता है, यही मैं चाहता हूं, इसे साझा करने के लिए धन्यवाद पोम्बर!
पार्क यूं नेउल

8
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

कृपया बताएं कि टेक्स्ट का आकार पिक्सेल मूल्य (COMPLEX_UNIT_PX) के रूप में कैसे सेट किया जाएगा। ओपी "
स्पाइस

यदि आप उपयोग करते COMPLEX_UNIT_PXहैं तो आपको घनत्व को विभाजित करने की आवश्यकता होती है।
विलियम हू

मुझे लगता है कि क्योंकि getDimension पहले से ही 'dp' को 'px' में बदल देता है
अली मौसवी खेराद


0

सभी समाधानों की कोशिश करने के बाद और कोई भी स्वीकार्य परिणाम नहीं दे रहा है (हो सकता है क्योंकि मैं डिफ़ॉल्ट रूप से बहुत बड़े फोंट वाले डिवाइस पर काम कर रहा था), मेरे लिए निम्न काम किया गया (COMPLEX_UNIT_DIP = डिवाइस इंडिपेंडेंट पिक्सल):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

Api स्तर 1 से, आप public void setTextSize (float size)विधि का उपयोग कर सकते हैं ।

प्रलेखन से:

"स्केल्ड पिक्सेल" इकाइयों के रूप में व्याख्या की गई मान के लिए डिफ़ॉल्ट पाठ आकार सेट करें। यह आकार वर्तमान घनत्व और उपयोगकर्ता फ़ॉन्ट आकार वरीयता के आधार पर समायोजित किया गया है।

पैरामीटर: आकार -> फ्लोट: स्केल्ड पिक्सेल आकार।

तो आप सरल कर सकते हैं:

textView.setTextSize(12); // your size in sp
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.