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.
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:
- Proje penceresinde res dizinini sağ tıklayın ve Yeni > Vektör Öğesi'ni tıklayın.
- Yerel dosya (SVG, PSD) seçeneğini belirleyin.
İçe aktarmak istediğiniz dosyayı bulun ve gerekli düzenlemeleri yapın.
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.
İleri'yi tıklayın.
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)
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.
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:
- 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. - 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"
Bitmap
inScaled
İç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