Поля LinearLayout, программно с dp - PullRequest
49 голосов
/ 06 февраля 2011

Можно ли установить поля LinearLayout программно, но не с пикселями, а с dp?

Ответы [ 6 ]

127 голосов
/ 06 февраля 2011

Вы можете использовать DisplayMetrics и определять плотность экрана.Примерно так:

int dpValue = 5; // margin in dips
float d = context.getResources().getDisplayMetrics().density;
int margin = (int)(dpValue * d); // margin in pixels

Насколько я помню, лучше использовать настил для смещения и округления для ширины.

16 голосов
/ 14 марта 2013

У меня была та же проблема, и я использовал эту технику для ее решения:

Сначала я добавил xml-файл в папку res / values, которая называлась dimension.xml. Это выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <dimen name="my_margin">5dip</dimen>
</resources>

Во-вторых, в моем коде я получил пиксельный эквивалент этого поля следующим образом (обратите внимание, что я использую Xamarin, так что это код C #, но чистая версия Java должна быть очень похожа):

int myMarginPx = Resources.GetDimensionPixelSize(Resource.Dimension.my_margin);

Наконец, я создаю параметры макета:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
layoutParams.SetMargins(myMarginPx, myMarginPx, myMarginPx, myMarginPx);
9 голосов
/ 24 марта 2013

Вы можете конвертировать dp в px, например, конвертировать 5dp в px:

Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics());
3 голосов
/ 29 мая 2013

У меня работает следующий метод для преобразования пикселей в dp:

int pixelToDP(int pixel) {
    final float scale = RaditazApplication.getInstance().getResources().getDisplayMetrics().density;
    return (int) ((pixel * scale) + 0.5f);
}
1 голос
/ 01 октября 2015

конвертировать DP в значение Pixel

int Whatever_valueInDP=10;//value in dp
int Value_In_Pixel= (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, Whatever_valueInDP, getResources()
                    .getDisplayMetrics());
0 голосов
/ 11 апреля 2019

Что ж, ребята из kotlin, у меня есть полезный помощник, который отлично работает

fun setMarginsInDp(v: View, l: Int, t: Int, r: Int, b: Int) {
    if (v.layoutParams is ViewGroup.MarginLayoutParams){
        val screenDensity: Float = v.context.resources.displayMetrics.density
        val params: ViewGroup.MarginLayoutParams = v.layoutParams as ViewGroup.MarginLayoutParams
        params.setMargins(l*screenDensity.toInt(), t*screenDensity.toInt(), r*screenDensity.toInt(), b*screenDensity.toInt())
        v.requestLayout()
    }
}

Просто передайте действительный вид и все настроено!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...