LayoutParams üzerinde programlı olarak yüksekliği yoğunluktan bağımsız pikseller olarak ayarlayın


123

LayoutParams'ın yüksekliğini / genişliğini yoğunluktan bağımsız pikseller (dp) olarak ayarlamanın herhangi bir yolu var mı ? Programlı olarak ayarlandığında yükseklik / genişlik dp değil piksel cinsindendir.

Yanıtlar:


271

Dip değerinizi piksellere dönüştürmeniz gerekir:

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

Benim için bu hile yapıyor.


10
GetActivity (). GetResources (). GetDimension (resourceID) 'nin doğru dönüştürme işlemlerini yaptığını düşünüyorum.
StErMi

3
Benim için işe yarıyor, ancak bu farklı ... Eğer xml kullanmak yerine yukarıdaki yöntemi kullanarak bir ImageView'un genişliğini / yüksekliğini ayarlarsam. XML'de 85dp ayarladım, yukarıdaki yöntemin aynı boyutu üretmek için "75" e ihtiyacı var. Herhangi bir fikrin neden?
Dirk

1
@Dirk Programlı olarak ayarladığınızda büyük olasılıkla bir dolgu / kenar boşluğu sorunu vardır (genellikle kodu ayarlarken dolguyu kendiniz belirtmeniz gerekir). XML'de veya kodda dp'yi ayarlamak arasında hiçbir fark olmamalıdır.
Tiago

11
 public static int getDPI(int size, DisplayMetrics metrics){
     return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;        
 }

Fonksiyonu şöyle çağırın,

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

int heigh = getDPI(height or width, metrics);

Bu ... gerçekten yanlış. Yalnızca sabit sayıda yoğunluğu desteklemek için kodlandınız. Yoğunluk ölçekleme faktörüne göre ölçeklemek istiyorsanız, sadece developer.android.com/reference/android/util/… ile çarpın, bu da yapmak (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT ile aynı olacaktır.
hackbod

1
Evet, yeni cevabınız makul. Veya dediğim gibi, sadece metrik yoğunluk ile çarpın. Bunun için.
hackbod

6

Birden çok kez kullanılabileceğinden:

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

Genellikle birden fazla değerin dönüştürülmesi gerektiğinden dönüşüm oranını kullanmayı daha pratik buldum. Dönüşüm oranı değişmediği için işlem süresinden biraz tasarruf sağlar.

/**
 * 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

İşte pasajım:

public class DpiUtils {

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

}

nerede DisplayMetrics metrics = getResources().getDisplayMetrics()


0

Cevaplanan çözüm benim için işe yaramadı, görüşün yüksekliği hala kapalıydı. Sonunda bununla sonuçlandım, bu iyi çalışıyor:

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

Ve tersini istiyorsanız, pikseller dp'ye ...

protected float px2dp(float px){
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    float dp = px / (metrics.densityDpi / 160f);
    return Math.round(dp);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.