android - TextView.setTextSize असामान्य रूप से व्यवहार करता है-विभिन्न स्क्रीन के लिए गतिशील रूप से टेक्स्टव्यू के टेक्स्ट आकार को कैसे सेट करें




(4)

इस उत्तर के लिए कुछ अतिरिक्त स्वाद जोड़ना, साथ ही कुछ भ्रम में भाग गया। आप इस प्रोजेक्ट में अपने किसी भी @RunWith(AndroidJUnit4.class) परीक्षण में इस परीक्षण को छोड़ने में सक्षम होना चाहिए (आपको अपने dimens.xml में आयाम जोड़ने की भी आवश्यकता होगी)।

नोट: ये सभी परीक्षण पास हो जाते हैं

@Test public void testScaledFontSizes() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    final Context context = InstrumentationRegistry.getTargetContext();

    Configuration configuration = context.getResources().getConfiguration();
    configuration.fontScale = 2.0f;
    configuration.densityDpi = 160; // mdpi, 1:1
    context.getResources().updateConfiguration(configuration, null);

    float scaledTextSize = context.getResources().getDimensionPixelSize(R.dimen.sp_15);
    assertEquals(30.0f, scaledTextSize);

    // Create a new TextView with the explicitly set configuration
    TextView textView = new TextView(context);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledTextSize);

    // 30, because font size is scaled
    assertEquals(30.0f, textView.getTextSize());

    // This is what we *don't* want, it's scaled *twice*!
    textView.setTextSize(scaledTextSize);
    assertEquals(60.0f, textView.getTextSize());

    // DP instead of SP tests
    float fifteenDp = context.getResources().getDimensionPixelSize(R.dimen.dp_15);
    assertEquals(15.0f, fifteenDp);

    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fifteenDp);
    // Still 15, because it's DP, not SP
    assertEquals(15.0f, fifteenDp);

    textView.setTextSize(fifteenDp);
    // 30, because setTextSize DOES font scaling
    assertEquals(30.0f, textView.getTextSize());
  }
}

मुझे लगता है कि बड़ा लेआउट यह है कि TextView.setTextSize(float) फ़ॉन्ट स्केलिंग लागू करता है , इसलिए यदि आप पहले से ही डीपी के बजाय एसपी के रूप में लेबल किए गए एक आयाम में गुजरते हैं, तो यह दो बार फ़ॉन्ट स्केलिंग प्राप्त करेगा।

https://code.i-harness.com

कॉलिंग TextView.setTextSize() असामान्य रूप से काम कर रहा है। सेट करने के लिए कॉल के ठीक बाद, अगर हमें setTextSize मिलता है getTextSize यह एक बहुत अधिक मूल्य लौटाता है जिसे हमने पहले सेट किया था।

यहां हम क्या कर रहे हैं:

zoomControl.setOnZoomInClickListener(new OnClickListener() {
    public void onClick(View view) {
        float size = mViewShabad.getTextSize() + 1;
        textView.setTextSize(size);
    }
});

क्या किसी ने इसे पहले कभी देखा है?


जब हम getTextSize () के साथ प्रोग्रामेटिक रूप से समस्या सेट करने की कोशिश करते हैं, तो sp / dp / dip के बजाय px में मान देता है और हम 1sp / dp = 1.5px (स्क्रीन आकार = 240) जानते हैं।

 titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*1.5f)); 

मेरे लिए पूरी तरह से काम कर रहा है या हम प्रदर्शन पैरामीटर का उपयोग पीएक्स: एसपी / डीपी अनुपात में कर सकते हैं, फिर उस मान को 1.5 एफ के साथ प्रतिस्थापित करें

means-> titleBar.setTextSize(TypedValue.COMPLEX_UNIT_SP, (getResources().getDimension(R.dimen.text_size)*your_sp_and_px_ratio_in_int f));

यह समस्या getTextSize() क्योंकि getTextSize() विधि आकार को पिक्सेल में वापस कर देता है स्क्रीन घनत्व पर निर्भर करता है! वास्तविक टेक्स्टसाइज प्राप्त करने के लिए इसका उपयोग करें:

DisplayMetrics metrics;
metrics = getApplicationContext().getResources().getDisplayMetrics();
float Textsize =myTextView.getTextSize()/metrics.density;
myTextView.setTextSize(Textsize+1);

मुझे आशा है कि यह इसे हल करे :)


यहां अंतर यह है कि setTextSize(int size) विधि में, डिफ़ॉल्ट रूप से इकाई प्रकार "sp" या "स्केल किए गए पिक्सेल" है। यह मान प्रत्येक स्क्रीन घनत्व (ldpi, mdpi, hdpi) के लिए एक अलग पिक्सेल आयाम होगा।

getTextSize() , दूसरी ओर, पाठ के वास्तविक पिक्सेल आयाम देता है।

आप इकाई प्रकार निर्दिष्ट करने के लिए setTextSize(int unit, float size) का उपयोग कर सकते हैं। इसके लिए निरंतर मान TypedValue क्लास में पाए जा सकते हैं, लेकिन उनमें से कुछ हैं:

TypedValue.COMPLEX_UNIT_PX   //Pixels

TypedValue.COMPLEX_UNIT_SP   //Scaled Pixels

TypedValue.COMPLEX_UNIT_DIP  //Device Independent Pixels




textview