टच इवेंट द्वारा उपयोग की जाने वाली इकाइयों में प्रोग्रामिंग, को अपने स्क्रीन आकार को कैसे पता लगाया जा सकता है और माप/लेआउट देखें? दूसरे शब्दों में, मैं टच इवेंट्स getRawX()/getRawY()
और View.getLocationOnScreen()
द्वारा उपयोग की गई समन्वय प्रणाली में स्क्रीन के निचले-दाएं कोने के के समन्वय को समन्वयित करना चाहता हूं।एक बार और सभी के लिए एंड्रॉइड स्क्रीन आकार प्रोग्रामेटिक रूप से कैसे प्राप्त करें?
मैं संकोच कर रहा हूँ जाहिर है के बाद से वांछित घटना/दृश्य इकाइयों "पिक्सल" कॉल करने के लिए विभिन्न मोड में मेरे फोन, पर "पिक्सल" के कई विचार देखते हैं और वे एक सुसंगत कहानी तक जोड़कर नहीं कर रहे हैं ।
मैं देख रहा हूँ इस लिए कहा गया है और stackoverflow पर एक बहुत के जवाब दिए और कहीं और, लेकिन जवाब में से कोई भी वास्तव में सभी साधनों में मेरे फोन (ड्रायड 4, एंड्रॉयड 4.1.2) पर काम करते हैं:
- Can I find out width of screen programmatically in android app?
- How do I get the ScreenSize programmatically in android
- Android set View visibility programmatically based on screen size
- How do I get the height of the screen in Android?
- Get the screen height in 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 and setting width and height programmatically in dp units
- 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 मेनिफेस्ट में) या नहीं, और मैं स्टेटस बार या किसी अन्य समान स्क्रीन सजावट की स्थिति, आकार या अस्तित्व के बारे में कोई भी धारणा नहीं करना चाहता हूं।
मेरे फोन (एक droid 4 एंड्रॉयड 4.1.2 चल) 540x960 पिक्सल शारीरिक, अर्थात छोटे रंगीन चमक डॉट्स है:
यहाँ तथ्य हैं। जब एप्लिकेशन स्क्रीन compat मोड में नहीं है
स्पर्श घटनाओं और देखें माप को देख से वांछित इकाइयों, में स्क्रीन के आकार, 360x640 जब एप्लिकेशन स्क्रीन compat मोड में है, 540x960 है। ये संख्याएं हैं जिन्हें मुझे प्रोग्रामेटिक रूप से खोजने की आवश्यकता है, उन्हें स्पर्श करने के लिए स्पर्श घटनाओं या दृश्यों के साथ छेड़छाड़ किए बिना, लेकिन मुझे किसी भी एपीआई को खोजने में अत्यधिक कठिनाई हो रही है जो इन नंबरों को वापस कर देगी।
प्रदर्शन और DisplayMetrics वस्तुओं विभिन्न तरीकों से प्राप्त सभी का दावा स्क्रीन आकार 540x960 "पिक्सल" (स्क्रीन compat मोड में है या नहीं) है। विशिष्ट होना करने के लिए निम्न सभी का कहना है कि 540x960 हर समय:। DisplayMetrics {चौड़ाई, ऊँचाई} पिक्सल, Display.getSize(), Display.getRealSize(), Display.get {चौड़ाई, ऊंचाई}(),
कॉन्फ़िगरेशन ऑब्जेक्ट्स विभिन्न तरीकों से प्राप्त सभी कहते हैं स्क्रीन {चौड़ाई, ऊंचाई} डीपी = 360x614 (चाहे स्क्रीन कंपैट मोड में हों या नहीं)। मुझे विश्वास नहीं है कि पूरे स्क्रीन का प्रतिनिधित्व करता है, क्योंकि पहलू अनुपात गलत है। (मुझे लगता है कि यह पूरी स्क्रीन स्टेटस बार से कम है; मुझे पूरी स्क्रीन चाहिए।) मुझे लगता है कि यह पूरी बात है कि पूरी स्क्रीन 360x640 डीपी, है हालांकि मुझे कोई एपीआई नहीं पता जो 640 लौटाता है।
DisplayMetrics विभिन्न तरीकों से प्राप्त कहते हैं कि "घनत्व" 1.0f है जब स्क्रीन compat मोड में, 1.5f जब नहीं स्क्रीन compat मोड में।
गतिविधि के क्योंकि इसे आमतौर पर वास्तविक आकार के बजाय
MATCH_PARENT
शामिलgetWindow().getAttributes().{width,height}
उपयोगी नहीं है। लेकिन मैं जाहिरा तौर पर से वांछित जवाब प्राप्त कर सकते हैं एक गतिविधि केgetWindow().getDecorView().getMeasured{Width,Height}()
(जो वास्तव में आश्चर्य की बात के बाद से गतिविधि की खिड़की के decorView नहीं देखने है जैसे कि यह पूरी स्क्रीन पर आ रहा है करता है, ऐसा लगता है कि यह स्क्रीन को ले रहा है स्टेटस बार घटाएं)। लेकिन मैं इस पर भरोसा नहीं करना चाहता क्योंकि अगर खिड़की का आकार बदल जाता है (सॉफ्ट कीबोर्ड दिख रहा है? कोई व्यक्ति window.setAttributes()? या शायद मैं एक गतिविधि में नहीं हूं), यह स्पष्ट रूप से है सब गलत होने जा रहा है।
मुझे समझ में निम्न सूत्र धारण करने के लिए माना जाता है: पिक्सल = डी पी * घनत्व सभी सूचना दी संख्या ((3), (4), (5) इसके बाद के संस्करण) जब से सहमत करने लगता है यही कारण है कि स्क्रीन संगतता मोड में नहीं: 540x960 = 360x640 * 1.5 लेकिन स्क्रीन संगतता मोड में यह जोड़ नहीं है: 540x960! = 360x640 * 1 तो, कुछ ख़राब है।
सरल व्याख्या, मुझे लगता है, कि "पिक्सल" के लिए गलत जवाब (3) ऊपर बस दे रहे हैं में सूचीबद्ध तरीकों जब स्क्रीन compat mode-- है कि में , वे लिए ही थे वापस जाने के लिए है 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);
}
वहाँ किसी भी बेहतर/क्लीनर रास्ता स्क्रीन के आकार को खोजने के लिए है ??
+1 ग्रेट सवाल, और बहुत सारे शोध प्रयास दिखाता है। –
@ डॉन इन [डॉक्स] (http://developer.android.com/guide/practices/screen-compat-mode.html), यह समझाया गया है कि संगतता मोड पुराने सेटअप पर "फिट करने के लिए ज़ूम" करने से रोक देगा। हालांकि, यह स्पष्ट रूप से स्पष्ट नहीं है कि "यह कैसे काम करता है", आपके अवलोकनों से, मुझे लगता है कि वे घनत्व स्केलिंग को बंद कर देते हैं, यानी 1px 1 डीपी बन जाता है। यह हो सकता है कि यह परिवर्तन केवल प्रतिपादन भाग में है, और 'DisplayMetrics' को ऐसे परिवर्तनों से कभी अपडेट नहीं किया गया है। [इस] (http://code.google.com/p/android/issues/detail?id=19921) पहले से ही दायर किए गए मुद्दे हैं। –
@ user117 - दिलचस्प। प्रदर्शन मेट्रिक्स का खैर * भाग * कम से कम अपडेट किया गया - घनत्व 1.0 में बदल गया। लेकिन चौड़ाई पिक्सेल/ऊंचाई पिक्सल को मिलान में नहीं बदला गया, ऐसा लगता है। इस मुद्दे के बारे में उद्धृत किया गया है, ऐसा लगता है कि व्यवहार 3.1 व्यवहार में वापस आ गया है (यानी मैं ऊंचाई पिक्सेल * देख रहा हूं * स्टेटस बार शामिल है ... लेकिन गलत इकाइयों में ऐसा लगता है) –