ฉันจะทราบขนาดหน้าจอโดยใช้โปรแกรมในหน่วยที่ใช้โดยเหตุการณ์การสัมผัสและดูการวัด / เค้าโครงได้อย่างไร ในคำอื่น ๆ ที่ฉันต้องการพิกัดของมุมขวาล่างของหน้าจอในระบบพิกัดที่ใช้โดยกิจกรรมสัมผัส
และgetRawX()/getRawY()View.getLocationOnScreen()
ฉันลังเลที่จะเรียกหน่วยเหตุการณ์ / มุมมองที่ต้องการว่า "พิกเซล" เนื่องจากเห็นได้ชัดว่าโทรศัพท์ของฉันมี "พิกเซล" หลายแบบในโหมดต่างๆและไม่ได้รวมเข้ากับเรื่องราวที่สอดคล้องกัน
ฉันเห็นว่ามีการถามและตอบคำถามมากมายใน stackoverflow และที่อื่น ๆ แต่ไม่มีคำตอบใดที่ใช้งานได้จริงบนโทรศัพท์ของฉัน (droid 4, android 4.1.2) ในทุกโหมด:
- ฉันสามารถค้นหาความกว้างของหน้าจอโดยทางโปรแกรมในแอพ Android ได้หรือไม่
- ฉันจะรับ ScreenSize โดยทางโปรแกรมใน Android ได้อย่างไร
- ชุด Android ดูการเปิดเผยตามโปรแกรมตามขนาดหน้าจอ
- ฉันจะรับความสูงของหน้าจอใน Android ได้อย่างไร
- รับความสูงของหน้าจอใน 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/Get-actual-screen-size-for-the-application-layout
- Android และการตั้งค่าความกว้างและความสูงโดยทางโปรแกรมเป็นหน่วย 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
(ว้าว!)
นี่คือรหัสไลบรารีที่ต้องทำงานไม่ว่าแอปจะอยู่ใน "โหมดความเข้ากันได้ของหน้าจอ" (เช่น targetSdkVersion <= 10 ในไฟล์ Manifest) หรือไม่ก็ตามและฉันก็ไม่ต้องการตั้งสมมติฐานใด ๆ เกี่ยวกับตำแหน่งขนาด หรือการมีอยู่ของแถบสถานะหรือการตกแต่งหน้าจออื่น ๆ ที่คล้ายกัน
นี่คือข้อเท็จจริง:
โทรศัพท์ของฉัน (droid 4 ที่ใช้ Android 4.1.2) มีพิกเซลจริง 540x960 นั่นคือจุดเรืองแสงสีเล็ก ๆ
ขนาดของหน้าจอในหน่วยที่ต้องการจากการดูเหตุการณ์การสัมผัสและดูการวัดคือ 360x640 เมื่อแอปอยู่ในโหมดใช้งานร่วมกับหน้าจอ 540x960 เมื่อแอปไม่ได้อยู่ในโหมดใช้งานร่วมกับหน้าจอ นี่คือตัวเลขที่ฉันต้องหาโดยใช้โปรแกรมโดยไม่ต้องยุ่งกับเหตุการณ์การสัมผัสหรือมุมมองเพื่อค้นหา แต่ฉันมีปัญหาอย่างมากในการค้นหา API ใด ๆ ที่จะส่งคืนตัวเลขเหล่านี้
วัตถุ Display และ DisplayMetrics ที่ได้รับด้วยวิธีต่างๆล้วนอ้างว่าขนาดหน้าจอคือ 540x960 "พิกเซล" (ไม่ว่าจะอยู่ในโหมดการใช้งานร่วมกับหน้าจอหรือไม่ก็ตาม) เพื่อให้เฉพาะเจาะจงสิ่งต่อไปนี้ทั้งหมดกล่าวว่า 540x960 ตลอดเวลา: DisplayMetrics. {width, height} Pixels, Display.getSize (), Display.getRealSize (), Display.get {Width, Height} (),
ออบเจ็กต์การกำหนดค่าที่ได้รับในรูปแบบต่างๆล้วนกล่าวว่าหน้าจอ {ความกว้างความสูง} Dp = 360x614 (ไม่ว่าจะอยู่ในโหมดใช้งานร่วมกับหน้าจอหรือไม่ก็ตาม) ฉันไม่เชื่อว่านั่นแสดงถึงทั้งหน้าจอเนื่องจากอัตราส่วนภาพไม่ถูกต้อง (ฉันคิดว่ามันเป็นทั้งหน้าจอลบแถบสถานะฉันต้องการทั้งหน้าจอ) ฉันคิดว่ามันปลอดภัยที่จะบอกว่าทั้งหน้าจอคือ 360x640 dp แม้ว่าฉันจะไม่รู้จัก API ใด ๆ ที่ส่งคืน 640 นั้น
DisplayMetrics ที่ได้รับในรูปแบบต่างๆกล่าวว่า "ความหนาแน่น" คือ 1.0f เมื่ออยู่ในโหมดใช้งานร่วมกับหน้าจอ 1.5f เมื่อไม่ได้อยู่ในโหมดใช้งานร่วมกับหน้าจอ
กิจกรรม
getWindow().getAttributes().{width,height}นี้ไม่มีประโยชน์เนื่องจากโดยทั่วไปจะมีMATCH_PARENTมากกว่าขนาดจริง แต่ผมเห็นได้ชัดว่าสามารถได้คำตอบที่ต้องการจากกิจกรรมของgetWindow().getDecorView().getMeasured{Width,Height}()(ซึ่งจริง ๆ แล้วน่าแปลกใจเพราะหน้าต่างกิจกรรมของ decorView ไม่ได้มีลักษณะเหมือนมันจะขึ้นหน้าจอทั้งหมดมันดูเหมือนว่ามันจะขึ้นหน้าจอลบแถบสถานะ) แต่ฉันไม่ต้องการพึ่งพาสิ่งนี้เพราะถ้าหน้าต่างเคยถูกปรับขนาด (แป้นพิมพ์อ่อนปรากฏขึ้นมีคนเรียก window.setAttributes ()? หรือบางทีฉันอาจไม่ได้อยู่ในกิจกรรมเลย) สิ่งนี้จะเป็นทั้งหมดอย่างชัดเจน ไม่ถูกต้อง.
ฉันเข้าใจว่าควรระงับสูตรต่อไปนี้: พิกเซล = dp * ความหนาแน่นที่ดูเหมือนจะเห็นด้วยกับตัวเลขที่รายงานทั้งหมด ((3), (4), (5) ด้านบน) เมื่อไม่ได้อยู่ในโหมดความเข้ากันได้ของหน้าจอ: 540x960 = 360x640 * 1.5 แต่ในโหมดความเข้ากันได้ของหน้าจอจะไม่เพิ่มขึ้น: 540x960! = 360x640 * 1 ดังนั้นมีบางอย่างผิดปกติ
ฉันคิดว่าคำอธิบายที่ง่ายที่สุดคือวิธีการที่ระบุไว้ใน (3) ด้านบนเป็นเพียงการให้คำตอบที่ผิดสำหรับ "พิกเซล" เมื่ออยู่ในโหมดใช้งานร่วมกับหน้าจอนั่นคือพวกเขาตั้งใจที่จะส่งคืน "พิกเซล" 360x640 แต่ผิด คืน 540x960 แทน แต่อาจมีวิธีอื่นในการมอง
ไม่ว่าในกรณีใดการได้รับตัวเลขที่ต้องการโดยไม่คำนึงถึงโหมดจากชิ้นส่วนปริศนาด้านบนเป็นปริศนาที่ยุ่งยากอย่างแน่นอน ฉันพบวิธีที่ดูเหมือนจะใช้งานได้กับโทรศัพท์ของฉันในทั้งสองโหมด แต่มันอ้อมค้อมมากและอาศัยสมมติฐานสองข้อที่ยังดูค่อนข้างสั่นคลอน (ตามที่อธิบายไว้ในความคิดเห็นของโค้ดด้านล่าง)
นี่คือสูตรของฉัน:
/** 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);
}
มีวิธีใดที่ดีกว่า / สะอาดกว่าในการหาขนาดของหน้าจอ ??
DisplayMetricsจะไม่มีการอัปเดตการเปลี่ยนแปลงดังกล่าว มีประเด็นเช่นนี้ยื่นฟ้องแล้ว