SetWidth (int pikseller) dip veya px kullanıyor mu?


Yanıtlar:


222

Piksel kullanır, ancak bunun yerine diplerin nasıl kullanılacağını merak ediyorsunuzdur. Cevap içeride TypedValue.applyDimension(). Kodda diplerin piksele nasıl dönüştürüleceğine ilişkin bir örnek:

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));

64
NbDips * getResources (). GetDisplayMetrics (). Yoğunluk
Romain Guy

9
Aslında, TypedValue.applyDimension () tam olarak bunu yapar. Bunu göndermeyi düşündüm, ancak herhangi bir değişiklik olması durumunda API'den geçmeyi seviyorum ... yine de, tamam verirseniz bu yöntemi kullanmak güvenli. :)
Dan Lew

12
ApplyDimension () sürümü daha fazla kod çalıştırıyor ve okuması biraz daha zor buluyorum. FWIW, yayınladığım satır, aslında çerçeve ve standart uygulamalarda her yerde kullandığımız şey.
Romain Guy

1
Merhaba, yukarıdaki iki örneği denedim ve pikselleri doğru hesaplamıyor gibi görünüyor. bunun yerine, bana kendi görünümümde belirttiğim tam değeri döndürüyor: benim durumumda android: layout_width = "50dip". bana xml dosyasındaki tam değeri 50 döndürecektir. Daha sonra bunu uygulamada kontrol ettim ve beklendiği gibi, değer yanlış ve görünümü beklenenden çok büyük çiziyor
Jonathan

Px'den pt'ye dönüşüm için bulduğum tek çözüm, çok güzel.
A-Live

24

Kodda sabit sayıda DIP elde etmenin doğru yolu, aşağıdakilere benzer dp değerlerini içeren bir kaynak XML dosyası oluşturmaktır:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

Ardından, kodunuzdaki kaynağa şu şekilde bakın:

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

Döndürdüğünüz kayan nokta, aygıtın piksel yoğunluğuna göre ölçeklenecektir ve bu nedenle, uygulamanız boyunca bir dönüştürme yöntemini çoğaltmaya devam etmenize gerek kalmaz.


Benim durumumda, bu çözüm en iyi, bir liste görünümüne sahip özel bir iletişim kutusuna sahip olduğum ve ListView'daki Başlık Etiketlerinin ve sütunlarının genişliğini aynı genişliğe ayarlamak istediğimde işe yarar.
Wayne Phipps

İlk cümleniz biraz komik, temelde bir XML dosyası oluşturmanın "kodda [bir şeyi] belirtmenin" doğru yolu olduğunu söylüyorsunuz . Sanırım, kodda sabiti belirtmeden sadece kullandığınızı düşünüyorum :)
Joffrey

@Joffrey evet ne demek istediğini anlıyorum, bu yüzden ifadeleri biraz güncelledim
SDJMcHattie

7

Method setWidth (100), genişlik olarak 100 piksel (dp olarak değil) ayarlayın. Bu nedenle, farklı android telefonlarda genişliği değişen sorunlarla karşılaşabilirsiniz.Yani piksel yerine dp cinsinden ölçüm kullanın.Örnek genişliğinin dp cinsinden ölçümü almak için aşağıdaki kodu kullanın = 300px ve yükseklik = 400px.

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());


0

Elbette pikseller, yöntem parametre olarak pikselleri istemektir.


1
Layout xml dosyasındaysa android: layout_width = "100dip" veya android: layout_width = "100px" belirtebiliriz. Kaynak kodda, bir düzenin genişliğini 100dip olarak belirleyemiyoruz?
user256239

Doğrudan değil, DisplayMetrics.density kullanarak kendinizi dönüştürmelisiniz.
Romain Guy

0

Benim için iyi çalışan yukarıdaki cevaplara dayanarak, bazı yardımcı yöntemler üretiyorum , bunları tüm projede kullanmak için araçlarınıza ekledim.

   // value in DP
   public static int getValueInDP(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInDP(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    // value in PX
    public static int getValueInPixel(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInPixel(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }
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.