4

我正在测量一个字符串文本,看看是否应该添加一个\n用于换行。

我正在使用该Paint.measureText函数,它在大多数情况下都有效,但我突然想到这并不准确,因为 px 不等于 dp - 我在网上看到了如何将像素转换为 dp,而是我例如,宁愿将 px 转换为屏幕大小的百分比

如果a是 8 像素宽,我会怎么说:

float LetterWidthPercent = _______ //get width of character in percent of screen width
float LetterHeightPercent = _______ //get height of character in percent of screen height

这样我就可以看到:

 if (LineOfTextWidth >= ScreenWidth * 0.9f) //90%

这将是一个非常有用的功能。

4

3 回答 3

1
public static double measureWeightPercent(Context context, String textToMeasure) {
    DisplayMetrics metrics = new DisplayMetrics();
    ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
            .getDefaultDisplay().getMetrics(metrics);

    TextView view = new TextView(context);
    view.setText(textToMeasure);
    view.measure(metrics.widthPixels, metrics.heightPixels);

    double textWidth = view.getMeasuredWidth();

    return textWidth / (metrics.widthPixels / 100);
}

您可以在将 TextView 绘制在屏幕上之前(或改为)测量带有文本的 TextView。通过这种方式,您可以为 TextView 设置任何字体或 textSize,并且始终知道文本在屏幕上的百分比。

于 2016-02-05T15:17:04.507 回答
1

您将需要通过 DisplayMetrics 或如何获得屏幕宽度......

要获取字符大小,请使用带有边界的绘制来计算。

characterWidth/screenWidth = characterScreenPercentage

我把它做成了双倍,但你可以很容易地把它改成浮点数。

对于字符:

public Double characterToScreenWidthPercentage(Character c) {
    Paint paint = new Paint();
    Rect boundA = new Rect();
    DisplayMetrics metrics = new DisplayMetrics();
    ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
            .getDefaultDisplay().getMetrics(metrics);
    paint.getTextBounds(Character.toString(c), 0, 1, boundA);
    Log.v("fn", Integer.toString(boundA.width()));
    Log.v("fn", Integer.toString(metrics.widthPixels));
    Log.v("fn", Double.toString((float) boundA.width() / (float) metrics.widthPixels));
    return ((double) boundA.width() / (double) metrics.widthPixels);
}

对于字符串:

public Double stringToScreenWidthPercentage(String str) {
    Paint paint = new Paint();
    Rect boundA = new Rect();
    DisplayMetrics metrics = new DisplayMetrics();
    ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
            .getDefaultDisplay().getMetrics(metrics);
    paint.getTextBounds(str, 0, 1, boundA);
    Log.v("fn", Integer.toString(boundA.width()));
    Log.v("fn", Integer.toString(metrics.widthPixels));
    Log.v("fn", Double.toString((float) boundA.width() / (float) metrics.widthPixels));
    return ((double) boundA.width() / (double) metrics.widthPixels);
}
于 2016-02-04T06:07:47.423 回答
0

您可以使用以下方法将 do 转换为像素,将像素转换为 dp。

将 dp 转换为像素:

public int dpToPixel(int dp) {
    DisplayMetrics dm= getContext().getResources().getDisplayMetrics();
    int pixel = Math.round(dp * (dm.xdpi / DisplayMetrics.DENSITY_DEFAULT));       
    return pixel
}

将像素转换为 dp:

public int pixelToDp(int pixel) {
    DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
    int dp = Math.round(pixel / (dm.xdpi / DisplayMetrics.DENSITY_DEFAULT));
    return dp;
}
于 2016-02-04T05:32:10.400 回答