Farklı piksel yoğunluklarını destekleme

Android cihazlar yalnızca farklı ekran boyutlarına sahip değildir. Bu boyutlar, telefon, tablet, TV, buna benzer. Bir bir cihazda inç başına 160 piksel, diğeri ise 480 piksel piksel olarak görünür. Bu varyasyonları kullandığında sistem, sonucunda bulanık görünebilir veya resimler boyut olarak yanlış olduğunu görürsünüz.

Bu sayfada, Google Etiket Yöneticisi'ni desteklemek için uygulamanızı Çözünürlükten bağımsız ölçü birimleri kullanarak farklı piksel yoğunlukları ve her piksel yoğunluğu için alternatif bit eşlem kaynakları sağlıyor.

Bu tekniklere genel bakış için aşağıdaki videoyu izleyin.

Simge öğeleri tasarlama hakkında daha fazla bilgi için Materyal Tasarım simge yönergelerine bakın.

Yoğunluktan bağımsız pikseller kullanma

Mesafeleri veya boyutları tanımlamak için piksel kullanmaktan kaçının. Boyutları şununla tanımlama: bir sorundur çünkü farklı ekranların piksel yoğunlukları farklı, Dolayısıyla, aynı sayıda piksel, farklı fiziksel boyutlara cihazlar.

Farklı yoğunluklara sahip iki cihaz ekranını gösteren resim
Şekil 1: Aynı boyuttaki iki ekranın piksel sayısı farklı olabilir.

Kullanıcı arayüzünün görünür boyutunu korumak için farklı yoğunluklara sahip ekranlarda kullanıcı arayüzünüzü tasarlarken yoğunluktan bağımsız piksel (dp) yöntemini seçin. Bir dp: orta yoğunluklu ekranda yaklaşık bir piksele eşit olan sanal piksel birimi (160 dpi veya "referans" yoğunluk). Android bu değeri her bir yoğunluk için uygun sayıda gerçek piksel olmalıdır.

Şekil 1'deki iki cihazı ele alalım. Bir görünüm 100 piksel genişliği, solda, cihazda çok daha büyük görünür. Görünüm değeri her iki ekranda da aynı boyutta görünür.

Metin boyutlarını tanımlarken bunun yerine ölçeklenebilir piksel (sp) olarak ayarlayın. Spb birimi varsayılan olarak dp ile aynı boyuttadır ancak kullanıcının tercihine göre yeniden boyutlandırılır metin boyutu. Düzen boyutları için hiçbir zaman sp kullanmayın.

Örneğin, iki görünüm arasındaki boşluğu belirtmek için dp kullanın:

<Button android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/clickme"
    android:layout_marginTop="20dp" />

Metin boyutunu belirtirken sp kullanın:

<TextView android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="20sp" />

dp birimlerini piksel birimlerine dönüştürün

Bazı durumlarda, boyutları dp olarak ifade etmeniz ve ardından bunları piksele dönüştürür. dp birimlerinin ekran piksellerine dönüştürülmesi şu şekildedir:

px = dp * (dpi / 160)

Not:Pikselleri hesaplamak için hiçbir zaman bu denklemi koda gömmeyin. Bunun yerine TypedValue.applyDimension(), birçok boyut türünü (dp, sp vb.) sizin için piksele dönüştürür.

Kaydırma veya sallama hareketinin tanındığı bir uygulama hayal edin kullanıcı parmağı en az 16 piksel hareket ettikten sonra. Temel çizgide önce kullanıcının parmağı, 1/10 inç (veya 2,5 mm) kadar 16 pixels / 160 dpi hareket ettirmelidir. hareket tanınır.

Bir cihazda yoğunluğa sahip bir ekranı (240 dpi) kullanıyorsanız kullanıcının parmağı 16 pixels / 240 dpi, bir inçin (veya 1,7 mm) 1/15'ine eşittir. Mesafe çok daha kısadır ve Dolayısıyla uygulama, kullanıcıya daha hassas görünür.

Bu sorunu düzeltmek için hareket eşiğini dp kodlu kodla ifade edin ve daha sonra bunu gerçek piksellere dönüştürebilirsiniz. Örnek:

Kotlin

// The gesture threshold expressed in dp
private const val GESTURE_THRESHOLD_DP = 16.0f

private var gestureThreshold: Int = 0

// Convert the dps to pixels, based on density scale
gestureThreshold = TypedValue.applyDimension(
  COMPLEX_UNIT_DIP,
  GESTURE_THRESHOLD_DP + 0.5f,
  resources.displayMetrics).toInt()

// Use gestureThreshold as a distance in pixels...

Java

// The gesture threshold expressed in dp
private final float GESTURE_THRESHOLD_DP = 16.0f;

// Convert the dps to pixels, based on density scale
int gestureThreshold = (int) TypedValue.applyDimension(
  COMPLEX_UNIT_DIP,
  GESTURE_THRESHOLD_DP + 0.5f,
  getResources().getDisplayMetrics());

// Use gestureThreshold as a distance in pixels...

DisplayMetrics.density alanı dp birimlerini piksel yoğunluğuna göre ayarlanır. Orta yoğunluklu ekranlarda DisplayMetrics.density eşittir ve yüksek yoğunluklu ekranda 1, 5'tir. Ekstra yüksek yoğunluklu ekranlarda, 2,0'a, düşük yoğunluklu ekranda ise 0,75'e eşittir. Bu değer TypedValue.applyDimension() tarafından şu amaçlarla kullanılıyor: mevcut ekranın gerçek piksel sayısını al.

Önceden ölçeklendirilmiş yapılandırma değerlerini kullanma

Ortak erişim düzeyine erişmek için ViewConfiguration sınıfını kullanabilirsiniz mesafeleri, hızları ve süreleri görebilirsiniz. Örneğin, kaydırma eşiği elde edildikçe çerçeve tarafından kullanılan piksel cinsinden mesafe getScaledTouchSlop() ile:

Kotlin

private val GESTURE_THRESHOLD_DP = ViewConfiguration.get(myContext).scaledTouchSlop

Java

private final int GESTURE_THRESHOLD_DP = ViewConfiguration.get(myContext).getScaledTouchSlop();

ViewConfiguration ürününde getScaled ön ekiyle başlayan yöntemler ne kadar olursa olsun düzgün görüntülenen piksel cinsinden bir değer döndürmesi piksel yoğunluğunda değişiklik gösterebilir.

Vektör grafikleri tercih et

Bir resmin yoğunluğa özel birden çok sürümünü oluşturmanın bir alternatifi de vektörel grafik oluşturabilirsiniz. Vektör grafikler XML kullanarak bir görüntü oluşturur ve piksel bit eşlemleri kullanmak yerine yolları ve renkleri tanımlama. Bu nedenle, vektör grafikler yapıları ölçeklendirmeden her boyuta ölçeklenebilir, ancak genelde fotoğraf değil simge gibi çizimler için idealdir.

Vektör grafikleri genellikle SVG (Scalable Vector Graphics) dosyaları olarak sağlanır. ancak Android bu biçimi desteklemediğinden SVG dosyalarını Android'in vektörü çekilebilir biçimindedir.

Android Studio'nun Vector Asset Studio şu şekilde:

  1. Proje penceresinde res dizinini sağ tıklayın ve Yeni > Vektör Öğesi'ni tıklayın.
  2. Yerel dosya (SVG, PSD) seçeneğini belirleyin.
  3. İçe aktarmak istediğiniz dosyayı bulun ve gerekli düzenlemeleri yapın.

    Android Studio&#39;da SVG&#39;lerin nasıl içe aktarılacağını gösteren resim
    Şekil 2: SVG'yi Android Studio'ya gidin.

    Asset Studio penceresinde bazı hatalar görebilirsiniz. değeri, vektörel çekilebilir öğelerin dosyanın bazı özelliklerini desteklemediğini gösterir. Bu durum, dosyayı içe aktarmanızı engellemez; desteklenmeyen özellikler yok sayılır.

  4. İleri'yi tıklayın.

  5. Sonraki ekranda, projenizde dosyanın bulunmasını istediğiniz kaynak grubunu onaylayın ve Son'u tıklayın.

    Tüm piksel yoğunluklarında çekilebilir bir vektör kullanılabildiğinden bu dosya aşağıda gösterildiği gibi varsayılan çekilebilir dizinler dizininize eklenir hiyerarşik olarak düzenlenmiştir. Yoğunluğa özel dizinler kullanmanız gerekmez.

    res/
      drawable/
        ic_android_launcher.xml
    

Vektör grafikleri oluşturma hakkında daha fazla bilgi için drawable (çekilebilir vektör) adlı makaleyi okuyun belgelerinden faydalanabilirsiniz.

Alternatif bit eşlemler sağlama

Farklı piksel yoğunluklarına sahip cihazlarda iyi bir grafik kalitesi sağlamak için uygulamanızda her bit eşlemin birden çok sürümünü sağlayın (her bit eşlemin bir sürümü) uygun bir çözünürlükte yükleyin. Aksi takdirde Android'in ölçeklendirme yapması gerekir. bit eşleminizin her bir ekranda aynı görünür alanı kaplamasını sağlar ve böylece ölçekleme kusurları (ör. bulanıklaştırma)

Farklı yoğunluk boyutlarındaki bit eşlemler için göreli boyutları gösteren resim
Şekil 3: Farklı yoğunluk paketlerindeki bit eşlemlerin göreli boyutları.

Uygulamalarınızda kullanabileceğiniz birkaç yoğunluk grubu vardır. Tablo 1 Kullanılabilen farklı yapılandırma niteleyicileri ve hangi ekran türlerini yardımcı olur.

Tablo 1. Farklı piksel yoğunlukları.

Yoğunluk niteleyici Açıklama
ldpi Düşük yoğunluklu (ldpi) ekranlar (yaklaşık 120 dpi) için kaynaklar.
mdpi Orta yoğunluklu (mdpi) ekranlar (~160 dpi) için kaynaklar. Bu, referans değerdir içerir.
hdpi Yüksek yoğunluklu (hdpi) ekranlar (yaklaşık 240 dpi) için kaynaklar.
xhdpi Ekstra yüksek yoğunluklu (xhdpi) ekranlar (yaklaşık 320 dpi) için kaynaklar.
xxhdpi Ekstra yüksek yoğunluklu (xxhdpi) ekranlar (yaklaşık 480 dpi) için kaynaklar.
xxxhdpi Ekstra çok yüksek yoğunluklu (xxxhdpi) için kaynaklar (~640 dpi).
nodpi Tüm yoğunluklara yönelik kaynaklar. Bunlar yoğunluktan bağımsız kaynaklardır. Sistem mevcut ekranın yoğunluğundan bağımsız olarak bu niteleyiciyle etiketlenen kaynakları ölçeklendirir.
tvdpi mdpi ve hdpi arasında bir yerdeki ekranlar için kaynaklar; yaklaşık olarak ~213 dpi. Bu öğe "birincil" olarak kabul edilmez seçmeniz gerekir. Çoğunlukla amaçlanan ve çoğu uygulama buna ihtiyaç duymaz. Bu sayede mdpi ve hdpi sağlanır. Çoğu uygulama için yeterli kaynaktır ve sistem bunları uygun olmalıdır. tvdpi için kaynak sağlamanız gerekiyorsa boyutunu 1,33 * mdpi katlayın. Örneğin, şu web sitesi için 100x100 piksellik bir resim: mdpi ekranlar, tvdpi için 133x133 pikseldir.

Farklı yoğunluklara yönelik alternatif bit eşlem çizimleri oluşturmak için altı birincil yoğunluk arasındaki 3:4:6:8:12:16 ölçeklendirme oranı. Örneğin yeni web sitesi orta yoğunluklu ekranlar için 48x48 piksel boyutunda bir çekilebilir bit eşlem kullanıyorsanız boyutları şöyledir:

  • Düşük yoğunluk (ldpi) için 36x36 (0,75x)
  • Orta yoğunluk için 48x48 (1,0x referans değer) (mdpi)
  • Yüksek yoğunluk (hdpi) için 72x72 (1,5x)
  • Ekstra yüksek yoğunluk (xhdpi) için 96x96 (2,0x)
  • Ekstra yüksek yoğunluk için 144x144 (3,0x) (xxhdpi)
  • Çok ekstra yüksek yoğunluk için 192x192 (4,0x) (xxxhdpi)

Oluşturulan resim dosyalarını uygun alt dizine yerleştirin res/ altında:

res/
  drawable-xxxhdpi/
    awesome_image.png
  drawable-xxhdpi/
    awesome_image.png
  drawable-xhdpi/
    awesome_image.png
  drawable-hdpi/
    awesome_image.png
  drawable-mdpi/
    awesome_image.png

Ardından, @drawable/awesomeimage özelliğine başvurduğunuzda sistem ekranın dpi'sine göre uygun bit eşlemi seçer. Şu durumda: söz konusu yoğunluk için yoğunluğa özel bir kaynak sağlamazsanız, sistem, bir sonraki en iyi eşleşmeyi seçer ve bunu ekrana sığacak şekilde ölçeklendirir.

İpucu: Çekilebilir kaynaklarınız varsa dönüşümleri artırmanız gerekmeyebilir. sırasında resim üzerinde bazı ayarlamalar yapabilirsiniz. Bunları bir nodpi yapılandırma niteleyicisine sahip dizin. Bu niteleyiciye sahip kaynaklar yoğunluktan bağımsız olarak kabul edilir ve sistem bunları ölçeklendirmez.

Diğer yapılandırma niteleyicileri ve doğru kaynakları nasıl seçtiğini Geçerli ekran yapılandırması için Uygulama kaynaklarına genel bakış bölümüne bakın.

Uygulama simgelerini mipmap dizinlerine yerleştirin

Diğer bit eşlem öğelerinde olduğu gibi, bu öğenin yoğunluğa özgü sürümlerini de uygulama simgenizdir. Ancak, bazı uygulama başlatıcılar, uygulama simgenizi %25'e kadar ve cihaz yoğunluğu grubunun gerektirdiğinden daha büyük olmalıdır.

Örneğin, bir cihazın yoğunluk grubu xxhdpi ise ve cihazınızda bulunan en büyük uygulama simgesi drawable-xxhdpi içindedir. Uygulama başlatıcı, bu simgeyi ölçeklendirir ve Bu nedenle de ekranın güncelliği azalır.

Bunu önlemek için tüm uygulama simgelerinizi drawable dizin yerine mipmap dizinde gösterin. Beğenmeyi kaldır drawable dizin, tüm mipmap dizinler APK'da tutulur, hatta bu dizin yoğunluğa özel APK'lar oluşturmanız gerekir. Bu şekilde, başlatıcı uygulamaları en iyi olanları seçebilir ana ekranda görüntülenecek çözünürlük simgesine dokunun.

res/
  mipmap-xxxhdpi/
    launcher_icon.png
  mipmap-xxhdpi/
    launcher_icon.png
  mipmap-xhdpi/
    launcher_icon.png
  mipmap-hdpi/
    launcher_icon.png
  mipmap-mdpi/
    launcher_icon.png

Önceki xxhdpi cihaz örneğinde mipmap-xxxhdpi dizininde daha yüksek yoğunluklu başlatıcı simgesi.

Simge tasarım yönergeleri için Sistem simgeleri konusuna bakın.

Uygulama simgeleri oluşturma konusunda yardım almak için Image Asset Studio ile uygulama simgeleri oluşturma konusuna bakın.

Yaygın olmayan yoğunluk sorunları için öneriler

Bu bölümde Android'in bit eşlemler için nasıl ölçeklendirme yaptığı açıklanmaktadır farklı piksel yoğunlukları için nasıl daha iyi kontrol farklı yoğunluklarda çizilir. Uygulamanız grafikleri değiştirmiyorsa veya farklı piksel yoğunluklarında çalışırken sorunlarla karşılaştıysanız, bu bölümü yoksayabilirsiniz.

Grafikleri değiştirirken birden fazla yoğunluğu nasıl destekleyebileceğinizi daha iyi anlamak için sistemin bit eşlemler için uygun ölçeği sağlamaya nasıl yardımcı olduğunu bilmeniz gerekir. Bu, aşağıdaki şekillerde gerçekleştirilir:

  1. Bit eşlem çekilebilir öğeleri gibi kaynakları önceden ölçeklendirme

    Mevcut ekranın yoğunluğuna göre sistem, mevcut ekranın yoğunluğuna göre kaynakları kullanın. Kaynaklar olarak ayarladığınızda, sistem varsayılan kaynakları yükler ve gerektiğinde ölçeklendirir. Sistem, varsayılan kaynakların ( yapılandırması niteleyicileri olmayan dizin) referans noktası için tasarlanır. piksel yoğunluğunu (mdpi) belirler ve bu bit eşlemleri kullanılacak boyuta piksel yoğunluğunu seçin.

    Önceden ölçeklendirilmiş bir kaynağın boyutlarını isterseniz sistem, değerleri döndürür. ölçeklendirme sonrası boyutları temsil eder. Örneğin, 50x50 piksel boyutunda tasarlanmış bir bit eşlem mdpi ekranı için hdpi ekranında 75x75 piksele ölçeklendirilir (alternatif kaynak yoksa değeri) olduğunda da sistem, boyutu bu şekilde bildirir.

    Bazı durumlarda Android'in önceden ölçeklendirme yapmasını istemeyebilirsiniz. bir kaynaktır. Ön ölçeklendirmeden kaçınmanın en kolay yolu, kaynağı bir kaynak dizinine yerleştirmektir nodpi yapılandırma niteleyicisiyle. Örnek:

    res/drawable-nodpi/icon.png

    Sistem bu klasördeki icon.png bit eşlemini kullandığında ölçeklendirmez. seçeneğini belirleyin.

  2. Piksel boyutlarını ve koordinatlarını otomatik ölçeklendirme

    android:anyDensity seçeneğini ayarlayarak ön ölçeklendirme boyutlarını ve resimleri devre dışı bırakabilirsiniz "false" olarak ayarlayın."false"BitmapinScaled İçinde bu durumda, sistem tüm mutlak piksel koordinatlarını ve pikselleri boyut değerleri gösterilir. Bu şekilde, piksel tanımlı ekran öğeleri, hemen hemen aynı fiziksel boyutta görüntülenmeye devam eder referans piksel yoğunluğunda (mdpi) görüntülenebilmeleri gerekir. Sistem, uygulamaya şeffaf bir şekilde gösterir ve ölçeklendirilmiş pikseli uygulama içine yerleştirin.

    Örneğin, bir cihazın 480x800 boyutunda bir WVGA yüksek yoğunluklu ekranı olduğunu ve normal bir HVGA ekranla aynı boyutta, ancak devre dışı bırakılmış bir uygulama çalıştırıyor. ön ölçeklendirmeden ibarettir. Bu durumda, sistem "yalanır" uygulama yükleme işlemini tamamladığında ve piksel yoğunluğu için yaklaşık mdpi çevirisi olan 320x533 değerini raporlar.

    Sonra, Uygulama, (10,10) ile (100) arasındaki bir dikdörtgeni geçersiz kılma gibi çizim işlemleri 100), sistem, koordinatları uygun miktarda ölçeklendirerek dönüştürür ve ardından bölgeyi (15,15) geçersiz hale getirerek (150, 150) değerini alır. Bu tutarsızlık, aşağıdaki durumlarda beklenmedik davranışa neden olabilir: uygulamanız ölçeklendirilmiş bit eşlemi doğrudan manipüle ediyor, ancak bu, makul bir ödün vermeden uygulama performansını artırmaya yardımcı olur. Bu sorunla karşılaşırsanız dp birimlerini piksele dönüştürme birimleri hakkında daha fazla bilgi edinin.

    Genellikle ön ölçeklendirmeyi devre dışı bırakmazsınız. Birden fazla içerik üreticiyi desteklemenin en iyi yolu bu sayfada açıklanan temel teknikleri uygulamaktır.

Uygulamanız bit eşlemleri değiştiriyorsa veya ekrandaki piksellerle doğrudan etkileşime giriyorsa bir diğer yoldansa, farklı yaklaşımları desteklemek için ek adımlar atmanız gerekebilir. piksel yoğunlukları. Örneğin, dokunma hareketlerine piksel sayısını belirlemek için, uygun piksel sayısını piksel değerleri kullanır. Ancak, normal koşullarda, dp ve px değerleri arasında dönüştürme.

Tüm piksel yoğunluklarında test et

Uygulamanızı farklı piksellere sahip birden fazla cihazda test edin yoğunluklarını ayarlayabilirsiniz. Fiziksel test cihaz kullanma Android Fiziksel erişiminiz yoksa emülatör farklı piksel yoğunluklarına sahip cihazlarda kullanılabilir.

Fiziksel cihazlarda test yapmak istiyorsanız almak istemiyorsanız, Firebase Test Lab'i kullanarak Google veri merkezindeki cihazlara erişme