自动调整 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 设置宽度和高度的方法:
- 如果您的 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);
- 如果您的 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);
- 现在,您的
tv
TextView 具有您在 xml 源代码中定义的文本大小,对吗?假设您的 TextView 字体大小为 14sp。
这意味着您的 TextView 高度为 14+6 -- > 20dp
所以,看看你的 tv
Textview
的字体大小
- 我假设您的文本视图大小为 14sp。现在您需要计算您创建的 SpannableString 中的最高比例。
基于 ss1.setSpan(new RelativeSizeSpan(1.4f), 0,1, 0);
最高比例为 1.4f
这意味着您 tv
的最高身高是 (20dp)*1.4
所以你想要的最终高度是<<<28dp>>>
- 在您的
dimens.xml
中定义此 28dp,如下所示:
<< ? xml version = "1.0"encoding = "utf-8" ? >
<resources >
...
<dimen name ="dimen28">28dp< /dimen>
...
</resources>
- 现在你这样做就完成了:
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);
背景
我需要使用 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 设置宽度和高度的方法:
- 如果您的 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);
- 如果您的 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);
- 现在,您的
tv
TextView 具有您在 xml 源代码中定义的文本大小,对吗?假设您的 TextView 字体大小为 14sp。
这意味着您的 TextView 高度为 14+6 -- > 20dp
所以,看看你的 tv
Textview
- 我假设您的文本视图大小为 14sp。现在您需要计算您创建的 SpannableString 中的最高比例。
基于 ss1.setSpan(new RelativeSizeSpan(1.4f), 0,1, 0);
最高比例为 1.4f
这意味着您 tv
的最高身高是 (20dp)*1.4
所以你想要的最终高度是<<<28dp>>>
- 在您的
dimens.xml
中定义此 28dp,如下所示:
<< ? xml version = "1.0"encoding = "utf-8" ? >
<resources >
...
<dimen name ="dimen28">28dp< /dimen>
...
</resources>
- 现在你这样做就完成了:
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);