在 android 上缩放字体大小以充分利用屏幕分辨率

Scale font size on android wear to fully utilize screen resolution

超级简单的问题:在adroid上字体大小和屏幕分辨率有什么关系? AVD?例如。如果分辨率宽度为 100px 并且 TextView 中有 10 个等宽字符,如果文本大小为 10px,我可以保证文本将占据整个屏幕宽度吗?

我的具体问题是我需要使用 textSize 缩放 10 个字符的文本,以使用全屏宽度(单独使用 textSize)。如果屏幕分辨率是 100 x 100,我想要 10 个字符水平地完全占据屏幕,为什么我不能只使用:

 DisplayMetrics metrics = getResources().getDisplayMetrics();
 float pixelFontSize = metrics.widthPixels / 10f;
 textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, pixelFontSize);

?在我的测试中,我在 280 x 280 wtih 280 dpi AVD 上得到的文本太小(使用大约 1/3 的分辨率),但在另一个 AVD 360 x 330 hdpi 上,上面的代码产生的文本太大而不适合在一条线上。 ...我的意思是,当然我可以看到需要从 pixcelFontSize 中减去少量以考虑文本布局,但我的结果到处都是。我肯定错过了什么。首先我弄乱了密度和比例测量 dp 和 sp,但逻辑会说鉴于我的问题,密度与它完全无关,对吧?

编辑,为了进一步说明问题,这是我使用字体大小缩放文本以适合显示的解决方案,适用于 7 或 8 AVD 的所有磨损,方圆和下巴

 switch (metrics.widthPixels) {
            case 280: //280 dpi

                    resolutionMultiplier = .4f;
                    ideoResolutionMultiplier = 0f;

                break;
            case 360: //hdpi
                resolutionMultiplier = .5f;
                ideoResolutionMultiplier = .0f;
                break;
            case 320: //works for round hdpi, chin tvdpi, but the res 320 square 280 dpi too tall....
                if(metrics.xdpi == 280) { 
                    resolutionMultiplier = .45f;
                    ideoResolutionMultiplier = 0f;
                }
                else {
                    resolutionMultiplier = .47f;
                    ideoResolutionMultiplier = 0f;
                }
                break;
            case 400: //280 dpi
                resolutionMultiplier = .55f;
                ideoResolutionMultiplier = 0f;
                break;
            case 480: //360 dpi
                resolutionMultiplier = .71f;
                ideoResolutionMultiplier = 0f;
                break;

        }

        if (mWzTheme.mWordArrays != null
                && mWzTheme.mWordArrays.isIdeographic()) {
            pixelFontSize = (metrics.widthPixels / new Integer(Constants.MAX_LINE_LENGTH_CHINESE_WATCH).floatValue())
                    + (new Integer(Constants.MAX_LINE_LENGTH_WATCH).floatValue() * ideoResolutionMultiplier);
        }
        else {
            pixelFontSize = (metrics.widthPixels / new Integer(Constants.MAX_LINE_LENGTH_WATCH).floatValue())
                    + (new Integer(Constants.MAX_LINE_LENGTH_WATCH).floatValue() * resolutionMultiplier);
        }

试试这个库:

https://github.com/AndroidDeveloperLB/AutoFitTextView

这将使文本完全适合屏幕。 (不确定 Android Wear 目标是否有任何问题。)

这是一个简单的解决方案:

Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text,0,text.length(),bounds);
int height = bounds.height();
int width = bounds.width();

...但仍然需要一种猜测算法来从屏幕分辨率到用 x 个字符填充屏幕所需的字体大小...