SORU
5 Temmuz 2013, Cuma


nasıl android ekran boyutu Program aracılığıyla, bir kez ve herkes için?

Nasıl programlı olarak benim ekran boyutu bulabilirim birimler dokunma olayları tarafından kullanılan ölçüm ve Görünüm/düzen? Diğer bir deyişle, koordinatları istiyorum ekranın sağ alt köşesinde, sistem dokunma olayları'tarafından kullanılan koordinat olarak getRawX()/getRawY() View.getLocationOnScreen().

İstediğiniz olayı görüntülemek birimleri "piksel"/aramak için tereddüt ediyorum belli ki orada "piksel"bazı kavramlar beri çeşitli modlarda telefonumda, ve tutarlı bir hikaye şey ifade etmiyorlar.

Bu teklif edildi ve bir sürü cevap var görüyorum stackoverflow ve diğer yerlerde, amayokcevaplar aslında benim telefonda iş (4, android 4.1.2) droid tüm modlarda:

(wow!)

Bu iş için gereken kütüphane kodu için app "ekranı uyumluluk modu"bakılmaksızın (&bildirimde;=10 lt yani targetSdkVersion) ya da değil, ve ben de herhangi bir varsayımda bulunmak istemiyorum ilgili konum, boyut, ya da durum çubuğunun varlığı ya da benzer başka bir ekran süslemeleri.


İşte gerçekler:

  1. benim telefon (droid 4 çalışan bir android 4.1.2) fiziksel 540x960 piksel vardır, yani küçük renkli parlak nokta.

  2. ekranın boyutunu istediğiniz birimleri, dokunma olayları ve Görünüm ölçümleri bakarak, Uygulama ekranındayken 360x640 uyumluluğu modu, Uygulama ekran içinde değilken 540x960 modu çekişmesi. Bu program aracılığıyla bulmak lazım rakamları dokunma olayları ile mucking olmadan ya da onları bulmak,Manzaralı ama aşırı zorluk herhangi bir API bulmakta zorlanıyorum bu numaraları dönecektir.

  3. Görüntü ve DisplayMetrics nesneleri elde çeşitli şekillerde tüm ekran boyutu iddiası "piksel"540x960. (ekran uyumluluğu modu veya değil) olsun. Spesifik olarak, aşağıdaki 540x960 her zaman söylüyoruz: DisplayMetrics.{genişlik,yükseklik}Piksel, Ekran.() getSize, Ekran.() getRealSize, Ekran.{Genişlik,Yükseklik}(),

  4. Yapılandırma nesneleri çeşitli yollarla elde demek ekran{Genişlik,Yükseklik} = 360x614 Dp (ekran uyumluluğu modu veya değil) olsun. Tüm ekranı gösteren inanmıyorum. bu yana en boy oranı yanlış. (Tüm ekranı bence eksi durum; tüm ekranı ihtiyacım bar.) Güvenli tam ekran 360x640 dp olduğunu söylemek sanırım herhangi bir API bilmiyorum ama 640 döner.

  5. DisplayMetrics çeşitli yollarla elde söyle "" yoğunluğu Ekran uyumluluğu modu,1.0 f zaman Ekran zaman 1.5 f modu çekişmesi.

  6. Etkinlik getWindow().getAttributes().{width,height} genellikle MATCH_PARENTiçerdiği için yararlı değil yerine gerçek boyutları. Ama görünüşe göre bir etkinliğin istenen cevap alabilirim getWindow().getDecorView().getMeasured{Width,Height}() aslında şaşırtıcı beri olan etkinlik penceresi decorView. yokbakgibi tüm ekranı kaplıyor; eksi durum çubuğunu ekranın alıyor gibi görünüyor. Ama eğer pencere yeniden boyutlandırılabilir hiç alırsa çünkü bu bel bağlamak istemiyorum (yumuşak klavye ortaya çıkıyor. birisi arama penceresi.() setAttributes? ya da belki bir Etkinlik içinde değilim), bu kesinlikle yanlış olacak.

Aşağıdaki formülü tutması gereken anlıyorum: piksel = dp * yoğunluk Bu bildirilen rakamlar((3),(4),(5) yukarıdaki ile aynı fikirde gibi görünüyor ne zamandeğilekran uyumluluk modu: 540x960 = 360x640 * 1.5 Ama ekran uyumluluk modu mantıklı değil: 540x960 != 360x640 * 1 Yani, bir şeyler ters.

En basit açıklama, sanırım, yöntemleri (3), yukarıda listelenen. sadece yanlış cevap veriyor "" piksel ekran uyumluluğu bu mod, istenmeyen için 360x640" ama yanlış 540x960 yerine.geri dönüyorlar "piksel dönüş Ama bu bakmanın başka yolları da olabilir.

Her durumda, tarzı ne olursa olsun, istediğiniz numaraları alma, yukarıda puzzle parçaları, kesinlikle zor bir bulmaca. Her iki modda da benim telefon üzerinde çalışmak için görünen bir yol buldum ama son derece dolambaçlı, ve hala oldukça zayıf görünen iki varsayımlara dayanıyor kod açıklamaları aşağıda açıklandığı gibi).

İşte benim tarifi:

/** 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[/getRawX()/getRawY()/])
{
    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);
}

Daha iyi daha temiz bir şekilde/var bulmak boyutunu ekranın??

CEVAP
10 EYLÜL 2013, Salı


Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

Şimdi bu birim cinsinden ölçülür textviews tüm düğmeleri ,çünkü santimetre daha iyi bir ölçüm birimi olan piksel ekran boyutu ölçebilirsiniz. Normalde ben kullanmak ne olduğunu

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HowToBasic

    HowToBasic

    8 Aralık 2011
  • Lupe Fiasco

    Lupe Fiasco

    23 ŞUBAT 2006
  • majesticdubstep

    majesticdubs

    3 Kasım 2011