Kaynak koddan res / değerleri / dimension.xml'den boyut değeri yükleyin


337

Değeri olduğu gibi yüklemek istiyorum. dimension.xmlBiri /res/values/dimension.xmldiğeri diğeri olmak üzere iki dosyam var /res/values-sw360dp/dimension.xml.

Kaynak koddan, şöyle bir şey yapmak istiyorum

getResources().getDimension(R.dimen.tutorial_cross_marginTop);

Bu işe yarar ancak elde ettiğim değer, ekran yoğunluk faktörünün çarpımı ile çarpılır (hdpi için 1,5, xhdpi için 2,0 vb.).

Ben de yapmaya çalıştım

getResources().getString(R.dimen.tutorial_cross_marginTop);

Bu prensipte işe yarar ama ben "dip" ile biten bir dize olsun ...


1
Kaynakların getDimensionPixelSize(int id)getDimension(int id)setPadding
Pixel'de

Yanıtlar:


812

Dimens.xml dosyamda var

<dimen name="test">48dp</dimen>

Kodda ben yaparsam

int valueInPixels = (int) getResources().getDimension(R.dimen.test)

bu, dokümanlar durumu olarak mevcut telefonun yoğunluğu ile çarpılan 72 değerini döndürür (benim durumumda 48dp x 1,5)

tam olarak dokümanların belirttiği gibi:

Belirli bir kaynak kimliği için bir boyut alın. Birim dönüşümleri, kaynaklarla ilişkili geçerli DisplayMetrics'i temel alır.

yani tam dp değerini xml'deki gibi istiyorsanız, bunu DisplayMetrics yoğunluğu ile bölün

int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density)

dp şimdi 48 olacak


3
Belgelerin burada özellikle belirsiz olduğunu düşünüyorum. "Birim dönüşümleri, kaynaklarla ilişkili geçerli DisplayMetrics'i temel alır." söylemek istedikleri tek şey piksellere dönüştürmeleridir.
Trilarion

Aslında, ekran metrikleri çarpanını atacaksanız, boyutunuzu piksel cinsinden de tanımlayabilirsiniz. <dimen name = "test"> 48 piksel </dimen>. getDimension (R.dimen.test) 48 döndürecektir.
Michael Peterson

Benim için çalışmıyor: stackoverflow.com/questions/55972518/…
Alex

@Trilarion Yine de basitçe piksele dönüştürmezler. Bunun dp, onu almak için kullanılan kaynak nesnesinin ölçeğine göre ölçeklendirilmiş piksel değerini vereceğini söylüyorlar . Kaynak elde etmek için çeşitli yollara girdikten sonra, bu daha alakalı olacaktır. Basit olması için, ekran ölçeğine göre olduğunu düşünebilirsiniz. Ayrıca, spsistem metin boyutuna göre pxveya doğrudan veya piksel vardır. Her biri farklı ve farklı bir amacı var.
Terk Edilmiş Sepet


17

ResourceSınıf da bir yöntemdir vardır getDimensionPixelSize () ihtiyaçlarınıza uygun olacaktır diye düşünüyorum.


24
Bu yanlış! metrik dönüşüm de getDimensionPixelSize()açıkça belirttiği dokümanlara başvurabilirseniz gerçekleşir İade Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.
Muhammed Babar

Bu yanlış. Metrik dönüşümü bu yöntem kullanılarak da gerçekleşir.
Michael Peterson

14

Sadece biraz tasarruf etmek isteyenler için intKaynaklarda için aşağıdakileri yapabilirsiniz.

integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="default_value">100</integer>
</resources> 

kod

int defaultValue = getResources().getInteger(R.integer.default_value);

2
Bunun için teşekkür ederim, belki de başkaları için olmasa da aradığım şeylerden daha
fazlaydı

11

GetDimension yerine getDimensionPixelOffset () yöntemini kullanabilirsiniz , böylece int öğesine yayınlamak zorunda kalmadınız.

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)


2
    This works but the value I get is multiplied times the screen density factor
  (1.5 for hdpi, 2.0 for xhdpi, etc).

Ben çözünürlük başına değeri almak iyi olduğunu düşünüyorum ama bunu yapmak istemiyorsanız bunu pks vermek .......

Yoğunluktan bağımsız piksel (dp)

Düzen boyutlarını veya konumunu yoğunluktan bağımsız bir şekilde ifade etmek için UI mizanpajını tanımlarken kullanmanız gereken sanal piksel birimi. Yoğunluktan bağımsız piksel, 160 dpi ekranda bir fiziksel piksele eşdeğerdir; bu, sistem tarafından bir "orta" yoğunluk ekranı için varsayılan temel yoğunluktur. Çalışma zamanında, sistem gerektiğinde dp birimlerinin herhangi bir ölçeklendirmesini şeffaf bir şekilde işler,based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. farklı yoğunluklara sahip ekranlarda UI'nizin düzgün bir şekilde görüntülenmesini sağlamak için uygulamanızın UI'sini tanımlarken her zaman dp birimlerini kullanmalısınız.

Ben çözünürlük başına değeri değiştirmek iyi olduğunu düşünüyorum ama bunu yapmak istemiyorsanız bunu pks vermek .......

bu bağlantıya bak

buna göre

dp

Yoğunluktan Bağımsız Pikseller - Ekranın fiziksel yoğunluğuna dayanan soyut bir birim. Bu birimler, 1dp'nin kabaca 1px'e eşit olduğu 160 dpi (inç başına nokta sayısı) ekrana göredir.When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down.Dp-piksel oranı ekran yoğunluğu ile değişecektir, ancak doğrudan orantılı olması gerekmeyecektir. Dp birimlerini kullanmak (piksel birimleri yerine), mizanpajınızdaki görünüm boyutlarının farklı ekran yoğunlukları için düzgün bir şekilde yeniden boyutlandırılması için basit bir çözümdür. Başka bir deyişle, kullanıcı arayüzü öğelerinizin farklı cihazlardaki gerçek dünya boyutlarında tutarlılık sağlar.

px

Pikseller - Ekrandaki gerçek piksellere karşılık gelir. Bu ölçü birimi önerilmez çünkü gerçek gösterim cihazlar arasında değişiklik gösterebilir; her cihaz inç başına farklı sayıda piksele sahip olabilir ve ekranda daha fazla veya daha az toplam piksele sahip olabilir.


2

Kotlin Uzantısı Kullanın

Bu işlemi basitleştirmek için bir uzantı ekleyebilirsiniz. Sadece context.dp(R.dimen. tutorial_cross_marginTop)Float değerini almak için arama yapmanızı sağlar

fun Context.px(@DimenRes dimen: Int): Int = resources.getDimension(dimen).toInt()

fun Context.dp(@DimenRes dimen: Int): Float = px(dimen) / resources.displayMetrics.density

Bağlam olmadan işlemek istiyorsanız şunları kullanabilirsiniz Resources.getSystem():

val Int.dp get() = this / Resources.getSystem().displayMetrics.density // Float

val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()

Örneğin, bir xhdpi cihazında şunu kullanın: 24.dp 12.0 almak veya 12.px24 almak için

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.