自动调整 TextView 和 spannableString

auto-fit TextView and spannableString

背景

我需要使用 SpannableString 在 textView 中显示金额,然后使 TextView 的字体适合给定的边界,如下所示:

SpannableString 代码:

String s= "2,000,000.000";
SpannableString ss1=  new SpannableString(s);

ss1.setSpan(new RelativeSizeSpan(1.4f), 0,1, 0); // set size 2
ss1.setSpan(new RelativeSizeSpan(1.2f), 2,5, 0); // set size 000 (first)
ss1.setSpan(new RelativeSizeSpan(1.2f), 6,9, 0); // set size 000 (second)
ss1.setSpan(new RelativeSizeSpan(1f), 10,13, 0); // set size 000 (Third)

TextView tv= (TextView)findViewById(R.id.money);
tv.setText(ss1);

问题

我的问题是让文本大小适合屏幕宽度

我尝试使用这些帖子的解决方案 (here and here),但其中 none 不适用于 SpannableString。

问题

有人知道这个问题的解决方案吗?

پسر؟ 您可以获得屏幕的宽度和高度并在任何地方使用它:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
final int DisplayHeight = displayMetrics.heightPixels;
final int DisplayWidth = displayMetrics.widthPixels;

在您的案例中,您想要为 tv 设置宽度,如下所示:

tv.getLayoutParams().width = DisplayWidth;

这个Measurement很强大,随便用在哪都行。唯一需要考虑的高度,如果你在 FULL_SCREEN 上有你的 Activity 标志,你实际上还需要考虑导航栏高度,这在大多数智能手机中都是 48dp

这意味着您可以使用 DisplayHeight+ContextCompat.getDimen(mContext,R.dimen.dimen48);

并在 dimen.xml 中将 dimen48 定义为 48dp

首先,这是为 Textview 设置宽度和高度的方法:

  1. 如果您的 TextView 在 RelativeLayour 中:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tv.getLayoutParams();

params.width = getResources().getDimensionPixelSize(R.dimen.any_width_you_want);
params.height = getResources().getDimensionPixelSize(R.dimen.any_height_you_want);

tv.setLayoutParams(params);

  1. 如果您的 TextView 位于其他任何内容中:

ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) tv.getLayoutParams();

params.width = getResources().getDimensionPixelSize(R.dimen.any_width_you_want);
params.height = getResources().getDimensionPixelSize(R.dimen.any_height_you_want);

tv.setLayoutParams(params);

  1. 现在,您的 tv TextView 具有您在 xml 源代码中定义的文本大小,对吗?假设您的 TextView 字体大小为 14sp。

这意味着您的 TextView 高度为 14+6 -- > 20dp

所以,看看你的 tv Textview

的字体大小
  1. 我假设您的文本视图大小为 14sp。现在您需要计算您创建的 SpannableString 中的最高比例。

基于 ss1.setSpan(new RelativeSizeSpan(1.4f), 0,1, 0); 最高比例为 1.4f

这意味着您 tv 的最高身高是 (20dp)*1.4

所以你想要的最终高度是<<<28dp>>>

  1. 在您的 dimens.xml 中定义此 28dp,如下所示:

<< ? xml version = "1.0"encoding = "utf-8" ? >
  <resources >
  ...
 
  <dimen name ="dimen28">28dp< /dimen>  
 
  ... 
  
 
  </resources>

  1. 现在你这样做就完成了:

params.height = getResources().getDimensionPixelSize(R.dimen.dimen28);
tv.setLayoutParams(params);

یادت نره من فرض کردم ساووونت شما 14 هستش。 ایц کار رو با ساونت خودت انودت انوام بده

好的,我自己解决了这个问题

随着放大,我使用了小型化

像这样:

ss1.setSpan(new RelativeSizeSpan(1.2f),  0,  1,  0);
ss1.setSpan(new RelativeSizeSpan( 1f ),  2,  5,  0);
ss1.setSpan(new RelativeSizeSpan( 1f ),  6,  9,  0);
ss1.setSpan(new RelativeSizeSpan(0.8f),  10, 13, 0);