मैं टच स्क्रीन इवेंट और व्यू माप / लेआउट द्वारा उपयोग की जाने वाली इकाइयों में, प्रोग्रामिक रूप से अपनी स्क्रीन का आकार कैसे पता लगा सकता हूं? दूसरे शब्दों में, मुझे स्क्रीन के निचले-दाएं कोने के निर्देशांक चाहिए, स्पर्श घटनाओं द्वारा उपयोग किए गए समन्वय प्रणाली में '
getRawX()/getRawY()और View.getLocationOnScreen()।
मैं वांछित घटना / दृश्य इकाइयों को "पिक्सेल" कहने में संकोच कर रहा हूं क्योंकि जाहिर है कि विभिन्न मोड में मेरे फोन पर "पिक्सेल" की कई धारणाएं हैं, और वे एक सुसंगत कहानी में नहीं जोड़ रहे हैं।
मुझे लगता है कि यह कहा गया है और स्टैक्वेरफ्लो और अन्य जगहों पर बहुत जवाब दिया गया है, लेकिन सभी में से कोई भी जवाब वास्तव में मेरे फोन पर काम नहीं करता है (droid 4, android 4.1.2)
- क्या मुझे एंड्रॉइड ऐप में प्रोग्राम की स्क्रीन की चौड़ाई पता चल सकती है?
- एंड्रॉइड में स्क्रीनसेज़ को मैं प्रोग्रामिक रूप से कैसे प्राप्त कर सकता हूं
- एंड्रॉइड सेट दृश्यता को स्क्रीन आकार के आधार पर प्रोग्रामेटिक रूप से देखें
- मुझे एंड्रॉइड में स्क्रीन की ऊंचाई कैसे मिलती है?
- 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
(वाह!)
यह उस लाइब्रेरी कोड के लिए है, जिसे इस बात पर ध्यान दिए बिना काम करना होगा कि ऐप "स्क्रीन कम्पैटिबिलिटी मोड" में है (यानी टार्गेटसडक्रोवेशन <= 10 मैनिफ़ेस्ट में) या नहीं, और मैं पोज़िशन, साइज़ के बारे में कोई धारणा नहीं बनाना चाहता , या स्टेटस बार या किसी अन्य समान स्क्रीन सजावट का अस्तित्व।
यहाँ तथ्य हैं:
मेरे फोन (एंड्रॉइड 4.1.2 पर चलने वाले एक droid 4) में 540x960 फिजिकल पिक्सल हैं, यानी थोड़े रंग के चमकदार डॉट्स।
टच ईवेंट्स और व्यू मापों को देखने से वांछित इकाइयों में स्क्रीन का आकार 360x640 है, जब ऐप स्क्रीन कॉम्पिटिशन मोड में है, 540x960 ऐप जब स्क्रीन कॉम्पेटिटर मोड में नहीं है। ये वे नंबर हैं जिन्हें मुझे प्रोग्रामिक रूप से ढूंढने की ज़रूरत है, बिना टच इवेंट्स या व्यूज़ के साथ मूकिंग करने के लिए, लेकिन मुझे इन ऐप को वापस करने वाले किसी भी एपीआई को खोजने में अत्यधिक कठिनाई हो रही है।
डिस्प्ले और डिस्प्लेमेट्रिक्स ऑब्जेक्ट विभिन्न तरीकों से प्राप्त किए गए हैं, सभी का दावा है कि स्क्रीन का आकार 540x960 "पिक्सेल" है (चाहे स्क्रीन कॉम्पिटिटर मोड में हो या नहीं)। विशिष्ट होने के लिए, निम्नलिखित सभी हर समय 540x960 कहते हैं: DisplayMetrics। {चौड़ाई, ऊँचाई} पिक्सेल, Display.getSize (), Display.getRealSize (), Display.get {चौड़ाई, ऊँचाई} (),
विभिन्न प्रकार से प्राप्त कॉन्फ़िगरेशन ऑब्जेक्ट सभी स्क्रीन को कहते हैं {Width, Height} Dp = 360x614 (स्क्रीन कम्प्रेसर मोड में है या नहीं)। मुझे विश्वास नहीं है कि पहलू अनुपात गलत है, पूरी स्क्रीन का प्रतिनिधित्व करता है। (मुझे लगता है कि यह पूरी स्क्रीन माइनस बार है; मुझे पूरी स्क्रीन की आवश्यकता है।) मुझे लगता है कि यह कहना सुरक्षित है कि पूरी स्क्रीन 360x640 डीपी है, हालांकि मुझे ऐसा कोई एपीआई नहीं पता है जो उस 640 को लौटाए।
विभिन्न तरीकों से प्राप्त DisplayMetrics का कहना है कि "घनत्व" 1.0f है जब स्क्रीन कॉम्पिटिटर मोड में, 1.5f जब स्क्रीन कम्प्रेसर मोड में नहीं।
गतिविधि
getWindow().getAttributes().{width,height}आम तौर परMATCH_PARENTवास्तविक आकारों के बजाय इसमें उपयोगी नहीं होती है। लेकिन मैं स्पष्ट रूप से एक गतिविधि से वांछित उत्तर प्राप्त कर सकता हूंgetWindow().getDecorView().getMeasured{Width,Height}()(जो वास्तव में आश्चर्य की बात है क्योंकि गतिविधि की खिड़की का डेकोर व्यू ऐसा नहीं लगता है कि यह पूरी स्क्रीन को उठा रहा है; ऐसा लग रहा है कि यह स्क्रीन का स्टेटस बार उठा रहा है)। लेकिन मैं इस पर भरोसा नहीं करना चाहता क्योंकि अगर खिड़की कभी भी आकार बदल जाती है (सॉफ्ट कीबोर्ड दिखाई दे रहा है? कोई व्यक्ति window.setAttributes () कह रहा है या शायद मैं किसी गतिविधि में नहीं हूं), यह स्पष्ट रूप से सब होने वाला है गलत।
मैं समझता हूं कि निम्नलिखित सूत्र को पकड़ना चाहिए: पिक्सल = डीपी * घनत्व जो सभी रिपोर्ट किए गए नंबरों ((3), (४), (५) से ऊपर के साथ सहमत होता है जब स्क्रीन संगतता मोड में नहीं है: ५४०x ९ ६० = ३६०x६४० - १.५ लेकिन स्क्रीन कम्पैटिबिलिटी मोड में यह नहीं जुड़ता है: 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ऐसे परिवर्तनों के बारे में कभी अपडेट न किया गया हो। इस तरह के मुद्दे पहले से ही दर्ज हैं।