Dokunmatik olayların kullandığı birimlerde ve Ölçümü / düzeni görüntüle'de ekran boyutumu programlı olarak nasıl öğrenebilirim? Başka bir deyişle, dokunmatik olayların kullandığı koordinat sisteminde ekranın sağ alt köşesinin koordinatlarını istiyorum '
getRawX()/getRawY()ve View.getLocationOnScreen().
Telefonumda çeşitli modlarda birkaç "piksel" kavramı olduğu ve tutarlı bir hikaye eklemediği için, istenen olay / görüntüleme birimlerini "piksel" olarak adlandırmakta tereddüt ediyorum.
Bunun stackoverflow'da ve başka yerlerde çok sorulduğunu ve yanıtlandığını görüyorum, ancak yanıtların hiçbiri telefonumda (droid 4, android 4.1.2) tüm modlarda çalışmıyor:
- Android uygulamasında programlı olarak ekran genişliğini bulabilir miyim?
- Android'de ScreenSize'ı programlı olarak nasıl edinebilirim
- Android, Görünürlüğü ekran boyutuna göre programlı olarak ayarlayın
- Android'de ekranın yüksekliğini nasıl alabilirim?
- Android'de ekran yüksekliğini alın
- https://groups.google.com/forum/#!topic/android-developers/IpxnfvDFrpc
- http://shuklaxyz.blogspot.com/2012/02/how-to-programmatically-figure-out.html
- http://coderock.net/how-to-determine-screen-resolution-programmatically/
- http://www.codeproject.com/Tips/313848/Get-actual-screen-size-for-the-application-layout
- Android ve dp birimlerinde programlı olarak genişlik ve yüksekliği ayarlama
- http://www.simplecodestuffs.com/how-to-get-screen-dimensions-programmatically-in-android/
- http://www.androidsnippets.com/get-size-and-orientation-of-the-screen
- http://grokbase.com/t/gg/android-developers/127aatfqb6/how-to-determine-screen-resolution-programmatically
(vay!)
Bu, uygulamanın "ekran uyumluluk modunda" (yani, bildirimde targetSdkVersion <= 10) olup olmadığına bakılmaksızın çalışması gereken kitaplık kodu içindir ve ayrıca konum, boyut hakkında herhangi bir varsayımda bulunmak istemiyorum veya durum çubuğunun veya diğer benzer ekran dekorasyonlarının varlığı.
İşte gerçekler:
telefonumda (android 4.1.2 çalıştıran bir droid 4) 540x960 fiziksel piksel var, yani küçük renkli parlak noktalar.
Dokunma olaylarına ve Görüntüleme ölçümlerine bakmadan istenen birimlerdeki ekranın boyutu, uygulama ekran uyumluluk modundayken 360x640, uygulama ekran uyumluluk modunda olmadığında 540x960'tır. Bunlar, dokunmatik olayları veya Görünümleri bulmak için uğraşmadan programlı olarak bulmam gereken sayılar, ancak bu sayıları döndürecek herhangi bir API bulmakta aşırı zorluk çekiyorum.
Çeşitli yollarla elde edilen Display ve DisplayMetrics nesnelerinin tümü ekran boyutunun 540x960 "piksel" olduğunu iddia eder (ekran uyumlu modda olsun veya olmasın). Spesifik olmak gerekirse, aşağıdakilerin tümü her zaman 540x960 der: DisplayMetrics. {Width, height} Pixels, Display.getSize (), Display.getRealSize (), Display.get {Width, Height} (),
Çeşitli şekillerde elde edilen yapılandırma nesnelerinin tümü ekran {Genişlik, Yükseklik} Dp = 360x614 (ekran uyumlu modda olsun veya olmasın) der. En boy oranı yanlış olduğu için bunun tüm ekranı temsil ettiğine inanmıyorum. (Sanırım tüm ekran eksi durum çubuğu; tüm ekrana ihtiyacım var.) Tüm ekranın 360x640 dp olduğunu söylemenin güvenli olduğunu düşünüyorum, ancak bu 640'ı döndüren herhangi bir API bilmiyorum.
Çeşitli şekillerde elde edilen DisplayMetrics, ekran uyumlu moddayken "yoğunluğun" 1.0f, ekran uyumlu modda olmadığında 1.5f olduğunu söyler.
Etkinlik
getWindow().getAttributes().{width,height}, genellikleMATCH_PARENTgerçek boyutlardan ziyade içerdiği için yararlı değildir . Ama görünüşe göre istediğim cevabı bir aktiviteden alabiliyorumgetWindow().getDecorView().getMeasured{Width,Height}()(bu aslında şaşırtıcı çünkü aktivitenin penceresinin decorView tüm ekranı kaplıyor gibi görünmüyor ; ekran eksi durum çubuğunu kaplıyor gibi görünüyor). Ancak buna güvenmek istemiyorum çünkü eğer pencere yeniden boyutlandırılırsa (ekran klavyesi görünüyor? Birisi window.setAttributes () 'ı arıyor mu? Veya belki de ben bir Aktivitede değilsem), açıkça hepsi bu olacak yanlış.
Aşağıdaki formülün tutması gerektiğini anlıyorum: piksel = dp * yoğunluk Ekran uyumluluk modunda olmadığında , bildirilen tüm sayılarla ((3), (4), (5) yukarıda) uyumlu görünüyor: 540x960 = 360x640 * 1.5 Ancak ekran uyumluluk modunda şu sonuç çıkmıyor: 540x960! = 360x640 * 1 Yani bir şeyler ters gidiyor.
Bence en basit açıklama, yukarıda (3) 'te listelenen yöntemlerin ekran uyumluluk modundayken basitçe "pikseller" için yanlış yanıt vermesidir - yani 360x640 "piksel" döndürmeleri amaçlanmıştır, ancak yanlıştır bunun yerine 540x960 döndürülüyor. Ama ona bakmanın başka yolları da olabilir.
Her durumda, yukarıdaki bulmaca parçalarından moddan bağımsız olarak istenen sayıları elde etmek kesinlikle zor bir bilmecedir. Telefonumda her iki modda da işe yarayan bir yol buldum, ancak son derece dolambaçlı ve hala oldukça titrek görünen iki varsayıma dayanıyor (aşağıdaki kod yorumlarında açıklandığı gibi).
İşte tarifim:
/** get screen size in "pixels", i.e. touchevent/view units.
* on my droid 4, this is 360x640 or 540x960
* depending on whether the app is in screen compatibility mode
* (i.e. targetSdkVersion<=10 in the manifest) or not. */
public void getScreenSizePixels(int widthHeightInPixels[/*2*/])
{
Resources resources = getResources();
Configuration config = resources.getConfiguration();
DisplayMetrics dm = resources.getDisplayMetrics();
// Note, screenHeightDp isn't reliable
// (it seems to be too small by the height of the status bar),
// but we assume screenWidthDp is reliable.
// Note also, dm.widthPixels,dm.heightPixels aren't reliably pixels
// (they get confused when in screen compatibility mode, it seems),
// but we assume their ratio is correct.
double screenWidthInPixels = (double)config.screenWidthDp * dm.density;
double screenHeightInPixels = screenWidthInPixels * dm.heightPixels / dm.widthPixels;
widthHeightInPixels[0] = (int)(screenWidthInPixels + .5);
widthHeightInPixels[1] = (int)(screenHeightInPixels + .5);
}
Ekranın boyutunu bulmanın daha iyi / temiz bir yolu var mı?
DisplayMetricsbu tür değişikliklerden asla güncellenmez. Gibi sorunlar var bu zaten açtı.