Программно установить высоту на LayoutParams как независимые от плотности пиксели - PullRequest
121 голосов
/ 11 мая 2011

Есть ли способ установить высоту / ширину LayoutParams как независимые от плотности пиксели (dp)? Похоже, высота / ширина, если они установлены программно, указаны в пикселях, а не в dp.

Ответы [ 5 ]

266 голосов
/ 11 мая 2011

Вам необходимо преобразовать значение провала в пиксели:

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());

Для меня это помогает.

12 голосов
/ 11 мая 2011
 public static int getDPI(int size, DisplayMetrics metrics){
     return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;        
 }

Вызовите такую ​​функцию,

DisplayMetrics metrics;
metrics = new DisplayMetrics();         
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int heigh = getDPI(height or width, metrics);
6 голосов
/ 09 февраля 2015

Поскольку его можно использовать несколько раз:

public static int convDpToPx(Context context, float dp) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}

Я нашел более практичным использование коэффициента конверсии, поскольку обычно необходимо конвертировать более одного значения.Поскольку коэффициент конверсии не изменяется, это экономит немного времени на обработку.

/**
 * Get conversion rate from dp into px.<br>
 * E.g. to convert 100dp: px = (int) (100 * convRate);
 * @param context e.g. activity
 * @return conversion rate
 */
public static float convRateDpToPx(Context context) {
    return context.getResources().getDisplayMetrics().densityDpi / 160f;
}
5 голосов
/ 17 января 2015

Вот мой фрагмент:

public class DpiUtils {

    public static int toPixels(int dp, DisplayMetrics metrics) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
    }

}

где DisplayMetrics metrics = getResources().getDisplayMetrics()

0 голосов
/ 19 января 2018

Решение, которое я получил, не сработало, высота обзора все еще была отключена.Я закончил с этим, который работает хорошо:

protected int dp2px(int dp){
    final float scale = getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
}

И если вы хотите наоборот, пикселей до dp ...

protected float px2dp(float px){
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    float dp = px / (metrics.densityDpi / 160f);
    return Math.round(dp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...