Làm cách nào tôi có thể tìm ra kích thước màn hình của mình theo chương trình, trong các đơn vị được sử dụng bởi các sự kiện chạm và Xem đo / bố cục? Nói cách khác, tôi muốn tọa độ của góc dưới bên phải của màn hình, trong hệ thống tọa độ được sử dụng bởi các sự kiện chạm '
getRawX()/getRawY()và View.getLocationOnScreen().
Tôi ngần ngại gọi các đơn vị sự kiện / chế độ xem mong muốn là "pixel" vì rõ ràng có một số khái niệm "pixel" trên điện thoại của tôi ở nhiều chế độ khác nhau và chúng không thêm vào một câu chuyện nhất quán.
Tôi thấy điều này đã được hỏi và trả lời rất nhiều trên stackoverflow và các nơi khác, nhưng không có câu trả lời nào thực sự hoạt động trên điện thoại của tôi (droid 4, android 4.1.2) trong tất cả các chế độ:
- Tôi có thể tìm ra chiều rộng của màn hình theo chương trình trong ứng dụng Android không?
- Làm cách nào để có được ScreenSize lập trình trong Android
- Thiết lập Android Xem khả năng hiển thị theo chương trình dựa trên kích thước màn hình
- Làm cách nào để có được chiều cao của màn hình trong Android?
- Lấy chiều cao màn hình trong Android
- https://groups.google.com/forum/#!topic/android-developers/IpxnfvDFrpc
- http: // shuklaxz.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 và cài đặt chiều rộng và chiều cao theo chương trình theo đơn vị 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!)
Mã này dành cho mã thư viện cần hoạt động bất kể ứng dụng có ở "chế độ tương thích màn hình" hay không (ví dụ: targetSdkVersion <= 10 trong bảng kê khai) hay không và tôi cũng không muốn đưa ra bất kỳ giả định nào về vị trí, kích thước hoặc sự tồn tại của thanh trạng thái hoặc bất kỳ trang trí màn hình tương tự nào khác.
Dưới đây là sự thật:
điện thoại của tôi (một droid 4 chạy Android 4.1.2) có các pixel vật lý 540x960, tức là các chấm phát sáng ít màu.
kích thước của màn hình trong các đơn vị mong muốn, từ việc xem các sự kiện chạm và Xem số đo, là 360x640 khi ứng dụng ở chế độ tương thích màn hình, 540x960 khi ứng dụng không ở chế độ tương thích màn hình. Đây là những con số tôi cần tìm theo chương trình, không có các sự kiện chạm hoặc Lượt xem để tìm chúng, nhưng tôi gặp khó khăn rất lớn trong việc tìm kiếm bất kỳ API nào sẽ trả về những con số này.
Các đối tượng Display và DisplayMetrics thu được theo nhiều cách khác nhau đều cho rằng kích thước màn hình là 540x960 "pixel" (cho dù ở chế độ tương thích màn hình hay không). Cụ thể, tất cả những điều sau đây đều nói 540x960 mọi lúc: DisplayMetrics. {Width, height} Pixels, Display.getSize (), Display.getRealSize (), Display.get {Width, height} (),
Các đối tượng cấu hình thu được theo nhiều cách khác nhau đều nói màn hình {Width, height} Dp = 360x614 (cho dù ở chế độ compat màn hình hay không). Tôi không tin rằng đại diện cho toàn bộ màn hình, vì tỷ lệ khung hình là sai. (Tôi nghĩ đó là toàn bộ màn hình trừ thanh trạng thái; tôi cần toàn bộ màn hình.) Tôi nghĩ rằng toàn bộ màn hình là 360x640 dp, mặc dù tôi không biết bất kỳ API nào trả về 640 đó.
DisplayMetrics thu được theo nhiều cách khác nhau cho biết "mật độ" là 1.0f khi ở chế độ compat màn hình, 1.5f khi không ở chế độ compat màn hình.
Các hoạt động
getWindow().getAttributes().{width,height}không hữu ích vì nó thường chứaMATCH_PARENTthay vì kích thước thực tế. Nhưng tôi rõ ràng có thể nhận được câu trả lời mong muốn từ một của hoạt độnggetWindow().getDecorView().getMeasured{Width,Height}()(được thực sự ngạc nhiên kể từ decorView cửa sổ của của hoạt động không giống như nó chiếm toàn bộ màn hình, nó trông giống như nó chiếm màn hình trừ đi thanh trạng thái). Nhưng tôi không muốn dựa vào điều này bởi vì nếu cửa sổ bị thay đổi kích thước (bàn phím mềm xuất hiện? Ai đó đang gọi window.setAttribut ()? Hoặc có thể tôi hoàn toàn không tham gia Hoạt động), đây rõ ràng sẽ là tất cả Sai lầm.
Tôi hiểu công thức sau đây được cho là giữ: pixel = dp * mật độ Có vẻ như đồng ý với tất cả các số được báo cáo ((3), (4), (5) ở trên) khi không ở chế độ tương thích màn hình: 540x960 = 360x640 * 1.5 Nhưng trong chế độ tương thích màn hình, nó không tăng thêm: 540x960! = 360x640 * 1 Vì vậy, có gì đó không ổn.
Tôi nghĩ rằng lời giải thích đơn giản nhất là các phương pháp được liệt kê trong (3) ở trên chỉ đơn giản là đưa ra câu trả lời sai cho "pixel" khi ở chế độ tương thích màn hình - nghĩa là chúng có ý định trả về 360x640 "pixel" nhưng chúng bị sai trả lại 540x960 thay thế. Nhưng có thể có những cách khác để xem xét nó.
Trong mọi trường hợp, có được các số mong muốn bất kể chế độ, từ các mảnh ghép ở trên, chắc chắn là một câu đố khó khăn. Tôi đã tìm thấy một cách có vẻ như hoạt động trên điện thoại của mình ở cả hai chế độ, nhưng nó cực kỳ mạch lạc và nó dựa trên hai giả định vẫn có vẻ khá run (như được mô tả trong các nhận xét mã bên dưới).
Đây là công thức của tôi:
/** 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);
}
Có cách nào tốt hơn / sạch hơn để tìm kích thước của màn hình không ??
DisplayMetricskhông bao giờ được cập nhật các thay đổi đó. Có những vấn đề như thế này đã được nộp.