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 周围定义填充(使用它来找到所需的最小填充量)。如果您有多个文本视图,请将形状的大小除以文本视图的数量,然后给每个文本视图一个分数。