Android:无法在程序化文本视图上设置小字体
Android: Can't make small fontsize on programmatic textviews
我正在使用以下方法,该方法以编程方式创建一个线性布局并用两个文本视图填充它,添加文本,然后将其变成一个可绘制对象,稍后我在形状上方使用一个图层。但是,我注意到我无法创建一个小字体大小 - 它似乎停留在相对..大的最小大小,并且我指定的任何低于该值的内容似乎都会让它看起来越来越模糊(但仍然是大小相同)。这可能是什么原因?
无论我是否使用 TypedValue.COMPLEX_UNIT_SP,都会出现此行为。
编辑:即使我指定了一些荒谬的东西,这个尺寸也保持不变:
.setTextSize(TypedValue.COMPLEX_UNIT_SP, 60);
它并没有变大 - 它只是变大了 "sharper"。
编辑 2:如果我将顶部文本视图指定为具有非常大的尺寸,那么我将第二个文本视图设置得越小,它就会变得越小 - 作为比率(例如,如果我将顶部设置为 100 并且50 的底部看起来与 10 的顶部和 5 的底部完全相同)。但是,我绝不能减小顶部文本视图的大小。
编辑 3:如果我删除其中一个文本视图,而仅将另一个文本视图保留为布局中的单个文本视图 - 我根本无法更改大小。我只能使它或多或少变得模糊,这取决于我设置的数字有多低,但它在屏幕上总是显示完全相同的大小。
private Drawable createTextLayer() {
LinearLayout newLinearLayout = new LinearLayout(getContext());
newLinearLayout.setOrientation(LinearLayout.VERTICAL);
newLinearLayout.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
newLinearLayout.setBackgroundColor(getColor(R.color.somecolor));
newLinearLayout.setLayoutParams(layoutParams);
TextView headlinetv = new TextView(getContext());
TextView bodytv = new TextView(getContext());
headlinetv.setText(headlineText);
headlinetv.setTextSize(7);
headlinetv.setGravity(Gravity.CENTER);
bodytv.setText(bodyText);
bodytv.setTextSize(6);
bodytv.setGravity(Gravity.CENTER);
newLinearLayout.addView(headlinetv);
newLinearLayout.addView(bodytv);
newLinearLayout.setDrawingCacheEnabled(true);
newLinearLayout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
newLinearLayout.layout(0, 0, newLinearLayout.getMeasuredWidth(), newLinearLayout.getMeasuredHeight());
newLinearLayout.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(newLinearLayout.getDrawingCache());
newLinearLayout.setDrawingCacheEnabled(false);
return new BitmapDrawable(getResources(), b);
}
将您的代码更改为:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 7);
将7的字号改成任意字号。
事实证明这很棘手,我花了几个小时才解决,但我将答案发布给其他遇到类似情况的人。
原因:
整个可绘制层是形状上方的最上层,因此无论如何都会拉伸到形状的大小。为了将其拉伸到形状的大小,最大的视图被拉伸(本质上是最长的文本视图),因此无法放大或缩小尺寸。
解决方法:
我又定义了两个文本视图,给它们最长的字符串 1 个字符,并使文本颜色透明。我宁愿给他们空白 space 作为内容,但 android 拒绝测量包含白色 space 的文本视图,因此它必须是实际文本。我将一个 textview 放在顶部,一个放在底部,因此可见文本完美居中且字体大小正确。
编辑:
事实证明有更好的方法来做到这一点。将 textview 定义为与其作为图层所在的形状相同的大小,并在 textview 周围定义填充(使用它来找到所需的最小填充量)。如果您有多个文本视图,请将形状的大小除以文本视图的数量,然后给每个文本视图一个分数。
我正在使用以下方法,该方法以编程方式创建一个线性布局并用两个文本视图填充它,添加文本,然后将其变成一个可绘制对象,稍后我在形状上方使用一个图层。但是,我注意到我无法创建一个小字体大小 - 它似乎停留在相对..大的最小大小,并且我指定的任何低于该值的内容似乎都会让它看起来越来越模糊(但仍然是大小相同)。这可能是什么原因?
无论我是否使用 TypedValue.COMPLEX_UNIT_SP,都会出现此行为。
编辑:即使我指定了一些荒谬的东西,这个尺寸也保持不变:
.setTextSize(TypedValue.COMPLEX_UNIT_SP, 60);
它并没有变大 - 它只是变大了 "sharper"。
编辑 2:如果我将顶部文本视图指定为具有非常大的尺寸,那么我将第二个文本视图设置得越小,它就会变得越小 - 作为比率(例如,如果我将顶部设置为 100 并且50 的底部看起来与 10 的顶部和 5 的底部完全相同)。但是,我绝不能减小顶部文本视图的大小。
编辑 3:如果我删除其中一个文本视图,而仅将另一个文本视图保留为布局中的单个文本视图 - 我根本无法更改大小。我只能使它或多或少变得模糊,这取决于我设置的数字有多低,但它在屏幕上总是显示完全相同的大小。
private Drawable createTextLayer() {
LinearLayout newLinearLayout = new LinearLayout(getContext());
newLinearLayout.setOrientation(LinearLayout.VERTICAL);
newLinearLayout.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
newLinearLayout.setBackgroundColor(getColor(R.color.somecolor));
newLinearLayout.setLayoutParams(layoutParams);
TextView headlinetv = new TextView(getContext());
TextView bodytv = new TextView(getContext());
headlinetv.setText(headlineText);
headlinetv.setTextSize(7);
headlinetv.setGravity(Gravity.CENTER);
bodytv.setText(bodyText);
bodytv.setTextSize(6);
bodytv.setGravity(Gravity.CENTER);
newLinearLayout.addView(headlinetv);
newLinearLayout.addView(bodytv);
newLinearLayout.setDrawingCacheEnabled(true);
newLinearLayout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
newLinearLayout.layout(0, 0, newLinearLayout.getMeasuredWidth(), newLinearLayout.getMeasuredHeight());
newLinearLayout.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(newLinearLayout.getDrawingCache());
newLinearLayout.setDrawingCacheEnabled(false);
return new BitmapDrawable(getResources(), b);
}
将您的代码更改为:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 7);
将7的字号改成任意字号。
事实证明这很棘手,我花了几个小时才解决,但我将答案发布给其他遇到类似情况的人。
原因:
整个可绘制层是形状上方的最上层,因此无论如何都会拉伸到形状的大小。为了将其拉伸到形状的大小,最大的视图被拉伸(本质上是最长的文本视图),因此无法放大或缩小尺寸。
解决方法:
我又定义了两个文本视图,给它们最长的字符串 1 个字符,并使文本颜色透明。我宁愿给他们空白 space 作为内容,但 android 拒绝测量包含白色 space 的文本视图,因此它必须是实际文本。我将一个 textview 放在顶部,一个放在底部,因此可见文本完美居中且字体大小正确。
编辑: 事实证明有更好的方法来做到这一点。将 textview 定义为与其作为图层所在的形状相同的大小,并在 textview 周围定义填充(使用它来找到所需的最小填充量)。如果您有多个文本视图,请将形状的大小除以文本视图的数量,然后给每个文本视图一个分数。