Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使文本视图中的字体相对于其大小变大或变小_Android_Textview - Fatal编程技术网

Android 如何使文本视图中的字体相对于其大小变大或变小

Android 如何使文本视图中的字体相对于其大小变大或变小,android,textview,Android,Textview,如何使TextView中的字体大小相对于当前字体大小稍大或稍小 我看到许多人使用硬编码的字体大小值,如15sp,但我希望避免这种情况,因为我希望独立于当前的字体大小。相反,我想将字体大小乘以1.2使其变大,乘以0.8使其变小,例如: // make font larger float size = textView.getTextSize()*1.2; textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); TextView tv = n

如何使
TextView
中的字体大小相对于当前字体大小稍大或稍小

我看到许多人使用硬编码的字体大小值,如
15sp
,但我希望避免这种情况,因为我希望独立于当前的字体大小。相反,我想将字体大小乘以1.2使其变大,乘以0.8使其变小,例如:

// make font larger
float size = textView.getTextSize()*1.2;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
TextView tv = new TextView(context);
不过,我想知道这是否是最好的方式,因为它看起来有点尴尬。这就是为什么我想问,如果没有像
15sp
这样的硬编码值,是否有更方便的方法使默认的
TextView
变大或变小一点

编辑

我应该补充一点,我正在以编程方式创建所有内容。我没有使用XML。因此,
TextView
是这样创建的:

// make font larger
float size = textView.getTextSize()*1.2;
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
TextView tv = new TextView(context);

通过这样做,
tv
将使用Android的默认字体设置。现在,我想用Java编程将
tv
中的字体变大或变小。

sp
值用于文本。SP代表“可缩放像素”。使用
sp
的好处是它可以根据用户的偏好进行缩放

我建议不要手动进行任何计算。
textView.getTextSize()
将返回的值本质上是“密度无关像素”(对于textSize,它将是
sp
)。这个价值很可能来自你的主题

使用与密度无关的像素是正确的方法(或者自动调整大小,仍然使用
dp
sp
)。您试图实现的将是混乱的,您将不知道它将如何在运行时扩展。使用“硬编码”值,例如
15sp
,它不会停止根据字体大小缩放文本,相反,它会相应地计算。举个例子,
15sp
将这样翻译:

对于100%字体大小:

  • ldpi11.25px
  • mdpi15.00px
  • hdpi22.50px
  • xhdpi30.00px
  • xxhdpi45.00px
对于75%的字体大小:

  • ldpi8.44px
  • mdpi11.25px
  • hdpi16.88px
  • xhdpi22.50px
  • xxhdpi33.75px
您可以做的是使用自动调整大小到Textview

要使用自动调整大小,您需要将textview转换为:


致:


以编程方式:

TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
文本视图,
16,//分钟
24,//最大值
1,//粒度步骤
TypedValue.COMPLEX\u UNIT\u SP
)
上述情况意味着:

  • 最小文本大小为16sp
  • 最大文本大小为24sp
  • 如果文本大小不是最大值或最小值,则它将按
    1sp
    的比例放大或缩小。因此,所有可用值将是
    16、17、18、19、20、21、22、23、24
注意:若要在TextView中使用AutoSize,请确保不要使用
包装内容,因为这可能会导致问题。我建议使用硬编码的值,或者如果使用ConstraintLayout以百分比或限制视图大小的实际约束来约束它

阅读更多:


  • 重写(基本)活动的
    attachBaseContext()
    ,并将其设置为fontScale

    override fun attachBaseContext(newBase: Context?) {
            val config =  Configuration()
            config.setToDefaults();
            config.fontScale = Random.nextFloat()*2;  // Here Goes scale value for 
            val context = newBase?.createConfigurationContext(config);
            super.attachBaseContext(context);
    }
    
    在我每次随机缩放的例子中,您可以将所需的缩放值保存在某个地方并在此处设置

        btnChangeSize.setOnClickListener {
            recreate()
        }
    

    将进行此函数调用,所有文本将按您的需要缩放

    对不起,我没有使用XML,但所有内容都是通过编程方式创建的。请参阅我的编辑。@Andreas我用Kotlin的例子编辑了我的答案。谢谢,但这也使用了硬编码值,如16和24。我希望完全避免硬编码的值,并拥有与默认字体大小相关的所有内容。添加了解释为什么我认为这是个坏主意。这不会缩放我所有视图的字体吗?我只想缩放单个视图的字体大小。是的,它将在所有视图上更改。