2011-02-06 2 views

ответ

109

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

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

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

+0

только в качестве комментария: Вы можете также использовать TypedValue.applyDimensions(), но кажется, что это лучше, см. http://stackoverflow.com/questions/2406449/does-setwidthint-pixels-use-dip-or-px/2406790#2406790 (Romain Guy - инженер Android) – bigstones

+0

+1 - I иметь пару виджета, которые я создал в коде (не используя XML), и вы можете устанавливать только пиксели. Как только я определил версию SDK, мои макеты сошли с ума. Я использовал это, чтобы исправить их ... Всегда используйте XML для макетов Android !!! – tpow

+3

Большой фрагмент. В самом деле. –

12

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

Во-первых, я добавил файл XML в мой Рез/значений папки dimensions.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); 

Наконец, я создаю мой макет Params:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent); 
layoutParams.SetMargins(myMarginPx, myMarginPx, myMarginPx, myMarginPx); 
+0

Чувак, Большое спасибо, Этот код мне помогает. –

+0

в форме android java, он должен выглядеть так: 'int getDimenInt (контекст контекста, @DimenRes int dimenRes) { return context.getResources(). GetDimensionPixelSize (dimenRes); } ' –

7

Вы можете конвертировать дп в рх, например, преобразовать 5 диоптрий рХ:

Resources r = mContext.getResources(); 
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics()); 
3

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

int pixelToDP(int pixel) { 
    final float scale = RaditazApplication.getInstance().getResources().getDisplayMetrics().density; 
    return (int) ((pixel * scale) + 0.5f); 
} 
1

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

int Whatever_valueInDP=10;//value in dp 
int Value_In_Pixel= (int) TypedValue.applyDimension(
      TypedValue.COMPLEX_UNIT_DIP, Whatever_valueInDP, getResources() 
        .getDisplayMetrics()); 
Смежные вопросы