TextView.setTextSize行为异常 - 如何为不同的屏幕动态设置textview的文本大小

时间:2010-09-10 18:02:25

标签: android textview

调用TextView.setTextSize()工作异常。在调用setTextSize之后,如果我们得到一个getTextSize,它返回的值远远高于我们之前设置的值。

以下是我们正在做的事情:

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

有没有人见过这个?

8 个答案:

答案 0 :(得分:343)

这里的区别在于,在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

答案 1 :(得分:16)

发生此问题是因为getTextSize()方法以像素为单位返回大小取决于屏幕密度!获取Actual TextSize使用此:

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

我希望它能解决它:)

答案 2 :(得分:7)

如果设置更改字体大小,导致显示错误,则可以执行以下操作:

setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.f);

答案 3 :(得分:4)

当我们尝试使用getTextSize()的setText()程序性问题时,返回px而不是sp / dp / dip的值,我们知道1sp / dp = 1.5px(屏幕大小= 240)。

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

对我来说非常合适,或者我们可以使用displaymatrix来实现px:sp / dp比率,然后用1.5f替换该值

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

答案 4 :(得分:2)

简而言之,如果您想要缩小文本大小

float size = mViewShabad.getTextSize()*1.1f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);

因为getTextSize()返回UNIT_PX,所以我们应该使用UNIT_PX

答案 5 :(得分:2)

科特林溶液

要使用资源进行设置,只需使用以下内容:

textView.setTextSize(COMPLEX_UNIT_PX, textView.resources.getDimension(R.dimen.my_text_size))

要对资源值执行相同的操作,请添加此扩展名属性,以更轻松地设置文字大小

textView.textSizeRes = R.dimen.my_text_size

var TextView.textSizeRes
    get() = textSize.toInt()
    set(@DimenRes textSizeRes) {
        setTextSize(COMPLEX_UNIT_PX, resources.getDimension(textSizeRes))
    }

答案 6 :(得分:0)

为这个答案添加一些额外的味道,也遇到了一些混乱。您能够将此测试放入项目中的任何@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) 应用字体缩放,因此如果传入已经标记为SP而不是DP的维度,那么它将接收字体缩放两次

答案 7 :(得分:0)

经过很长一段时间,终于解决了

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

创建这样的dimen文件夹res / values / dimensions.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

 <dimen name="textsize">8sp</dimen>

 </resources>