Bagaimana saya bisa mengetahui ukuran layar saya secara terprogram, dalam unit yang digunakan oleh acara sentuh dan Lihat pengukuran / tata letak? Dengan kata lain, saya ingin koordinat sudut kanan bawah layar, dalam sistem koordinat yang digunakan oleh event sentuh
getRawX()/getRawY()dan View.getLocationOnScreen().
Saya ragu untuk memanggil unit acara / tampilan yang diinginkan "piksel" karena ternyata ada beberapa gagasan "piksel" pada ponsel saya dalam berbagai mode, dan mereka tidak menambahkan cerita yang konsisten.
Saya melihat ini telah ditanyakan dan banyak dijawab di stackoverflow dan di tempat lain, tetapi tidak ada jawaban yang benar-benar berfungsi pada ponsel saya (droid 4, android 4.1.2) di semua mode:
- Bisakah saya mencari tahu lebar layar secara terprogram di aplikasi android?
- Bagaimana cara mendapatkan ScreenSize secara terprogram di android
- Android mengatur Tampilan visibilitas secara terprogram berdasarkan pada ukuran layar
- Bagaimana cara mendapatkan ketinggian layar di Android?
- Dapatkan ketinggian layar di Android
- 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/Dapatkan-actual-screen-size-for-the-application-layout
- Android dan mengatur lebar dan tinggi secara terprogram dalam satuan dp
- 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
(Wow!)
Ini untuk kode pustaka yang perlu bekerja terlepas dari apakah aplikasi dalam "mode kompatibilitas layar" (mis. TargetSdkVersion <= 10 dalam manifes) atau tidak, dan saya juga tidak ingin membuat asumsi tentang posisi, ukuran , atau keberadaan bilah status atau dekorasi layar serupa lainnya.
Berikut ini faktanya:
telepon saya (droid 4 yang menjalankan Android 4.1.2) memiliki 540x960 piksel fisik, yaitu titik-titik bercahaya kecil berwarna.
ukuran layar di unit yang diinginkan, dari melihat acara sentuh dan Lihat pengukuran, adalah 360x640 ketika aplikasi dalam mode compat layar, 540x960 ketika aplikasi tidak dalam mode compat layar. Ini adalah angka yang harus saya temukan secara terprogram, tanpa mucking dengan acara sentuh atau Tampilan untuk menemukannya, tapi saya mengalami kesulitan yang sangat besar untuk menemukan API yang akan mengembalikan angka-angka ini.
Obyek Display dan DisplayMetrics diperoleh dengan berbagai cara, semuanya mengklaim ukuran layar adalah 540x960 "piksel" (baik dalam mode compat layar atau tidak). Untuk lebih spesifik, semua yang berikut mengatakan 540x960 setiap saat: DisplayMetrics. {Width, height} Pixels, Display.getSize (), Display.getRealSize (), Display.get {Lebar, Tinggi} (),
Objek konfigurasi yang diperoleh dengan berbagai cara semuanya mengatakan layar {Width, Height} Dp = 360x614 (baik dalam mode compat layar atau tidak). Saya tidak percaya itu mewakili seluruh layar, karena rasio aspeknya salah. (Saya pikir ini adalah seluruh layar dikurangi status bar; Saya perlu seluruh layar.) Saya pikir aman untuk mengatakan bahwa seluruh layar adalah 360x640 dp, meskipun saya tidak tahu ada API yang mengembalikan itu 640.
DisplayMetrics diperoleh dengan berbagai cara mengatakan "densitas" adalah 1.0f ketika dalam mode compat layar, 1.5f ketika tidak dalam mode compat layar.
Kegiatan
getWindow().getAttributes().{width,height}ini tidak membantu karena biasanya berisiMATCH_PARENTdaripada ukuran sebenarnya. Tapi saya rupanya bisa mendapatkan jawaban yang diinginkan dari suatu aktivitasgetWindow().getDecorView().getMeasured{Width,Height}()(yang sebenarnya mengejutkan karena dekorasi tampilan jendela aktivitas itu tidak terlihat seperti mengambil seluruh layar; sepertinya mengambil layar dikurangi bar status). Tapi saya tidak ingin bergantung pada ini karena jika jendela pernah diubah ukurannya (keyboard lunak muncul? Seseorang memanggil window.setAttributes ()? Atau mungkin saya tidak dalam suatu Kegiatan sama sekali), ini jelas akan menjadi semua salah.
Saya memahami rumus berikut yang seharusnya dipegang: piksel = dp * kerapatan Yang tampaknya sesuai dengan semua angka yang dilaporkan ((3), (4), (5) di atas) ketika tidak dalam mode kompatibilitas layar: 540x960 = 360x640 * 1.5 Tetapi dalam mode kompatibilitas layar itu tidak bertambah: 540x960! = 360x640 * 1 Jadi, ada sesuatu yang salah.
Penjelasan yang paling sederhana, saya pikir, adalah bahwa metode yang tercantum dalam (3) di atas hanya memberikan jawaban yang salah untuk "piksel" ketika dalam mode compat layar - yaitu, mereka dimaksudkan untuk mengembalikan 360x640 "piksel" tetapi mereka salah mengembalikan 540x960 sebagai gantinya. Tapi mungkin ada cara lain untuk melihatnya.
Bagaimanapun, mendapatkan angka yang diinginkan terlepas dari mode, dari potongan puzzle di atas, tentu saja merupakan teka-teki yang rumit. Saya telah menemukan cara yang tampaknya berfungsi pada ponsel saya di kedua mode, tetapi sangat berputar-putar, dan bergantung pada dua asumsi yang masih tampak agak goyah (seperti yang dijelaskan dalam komentar kode di bawah).
Ini resep saya:
/** 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);
}
Apakah ada cara yang lebih baik / lebih bersih untuk menemukan ukuran layar ??
DisplayMetricstidak pernah diperbarui dari perubahan tersebut. Ada masalah seperti ini sudah diajukan.