Как преобразовать ширину текста в пикселях в проценты от ширины/высоты экрана?

Я измеряю текст строки, чтобы увидеть, должен ли я добавить \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%

Эту функцию было бы очень полезно иметь под рукой.


person GideonKain    schedule 15.09.2011    source источник
comment
@CrandellWS помогите мне понять, что именно вы хотите от этого вопроса? Разве это не просто подсчет ширины экрана на getWindowManager().getDefaultDisplay().getMetrics(metrics) и деление на него измеренной ширины текста? (что касается вашего собственного вопроса, который вы упомянули, просто установите fontSize на основе ширины экрана dp и т. д.)   -  person Konstantin Loginov    schedule 01.02.2016
comment
Я честно пытался привлечь внимание к своему собственному вопросу -› stackoverflow.com/questions/35117278/‌​ext-on-a-canvas, который я решил, и вы можете использовать это решение для создания ответа на этот вопрос. Репутация для меня не очень важна, так что не стесняйтесь собирать 50...   -  person CrandellWS    schedule 01.02.2016
comment
@GideonKain, вы можете использовать библиотеку поддержки процента макета и можете давать процент виджетам. Вы можете проверить образец здесь. androidauthority.com/   -  person Wasim K. Memon    schedule 04.02.2016


Ответы (3)


Вам нужно будет получить ширину экрана через 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);
}
person CrandellWS    schedule 04.02.2016

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 с текстом внутри, прежде чем (или вместо этого) рисовать его на экране. Таким образом, вы можете установить любой шрифт или textSize для TextView и всегда знать, сколько процентов будет занимать текст на экране.

person Andrii Khrystovyi    schedule 05.02.2016
comment
хороший ответ, который будет полезен и лучше для ресурсов, чем мое предложение. - person CrandellWS; 05.02.2016

Вы можете использовать следующие методы для преобразования do в пиксель и пиксель в 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;
}
person Rakesh    schedule 04.02.2016
comment
Вам нужно будет использовать границы, чтобы получить высоту и ширину пикселя - person CrandellWS; 04.02.2016
comment
попробуйте переработать свой ответ, возможно, это поможет stackoverflow.com/a/35193695/1815624 - person CrandellWS; 04.02.2016