2011-02-06 11 views

Odpowiedz

109

Można użyć DisplayMetrics i określić gęstość ekranu. Coś w tym stylu:

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

Jak pamiętam, lepiej użyć wykładzin podłogowych do przesunięć i zaokrągleń dla szerokości.

+0

prostu jako komentarz: można również użyć TypedValue.applyDimensions(), ale wygląda na to, że jest lepszy, zobacz http://stackoverflow.com/questions/2406449/does-setwidthint-pixels-use-dip-or-px/2406790#2406790 (Romain Guy jest inżynierem Androida) – bigstones

+0

+1 - I Mam parę widżetów, które zbudowałem w kodzie (nie używając XML), i możesz tam ustawić tylko piksele. Jak tylko określiłem wersję SDK, moje układy zwariowały. Użyłem tego, aby je naprawić ... Zawsze używaj XML dla układów Android !!! – tpow

+3

Świetny fragment. Naprawdę. –

12

miałem ten sam problem i stosować tę technikę, aby go rozwiązać:

pierwsze, dodałem plik xml do moich RES/wartości folder o nazwie dimensions.xml. Wygląda to tak:

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

Po drugie, w moim kodu, mam odpowiednik piksela tego marginesu następująco (zauważ Używam Xamarin więc to jest kod C#, ale czysta wersja Java powinna być bardzo podobna):

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

Wreszcie, tworzę moje params układ:

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

Stary, Wielkie dzięki, ten kod mi pomaga. –

+0

w formie android java, powinno to być: 'int getDimenInt (kontekst kontekstowy, @DimenRes int dimenRes) { return context.getResources(). GetDimensionPixelSize (dimenRes); } ' –

7

można konwertować DP px, na przykład konwertować 5DP do px:

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

Poniższa metoda działa dla mnie do konwersji pikseli DP:

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

konwersji DP wartości Pixel

int Whatever_valueInDP=10;//value in dp 
int Value_In_Pixel= (int) TypedValue.applyDimension(
      TypedValue.COMPLEX_UNIT_DIP, Whatever_valueInDP, getResources() 
        .getDisplayMetrics()); 
Powiązane problemy