कैसे एक बार और सभी के लिए, क्रमिक रूप से Android स्क्रीन आकार प्राप्त करें?


132

मैं टच स्क्रीन इवेंट और व्यू माप / लेआउट द्वारा उपयोग की जाने वाली इकाइयों में, प्रोग्रामिक रूप से अपनी स्क्रीन का आकार कैसे पता लगा सकता हूं? दूसरे शब्दों में, मुझे स्क्रीन के निचले-दाएं कोने के निर्देशांक चाहिए, स्पर्श घटनाओं द्वारा उपयोग किए गए समन्वय प्रणाली में ' getRawX()/getRawY()और View.getLocationOnScreen()

मैं वांछित घटना / दृश्य इकाइयों को "पिक्सेल" कहने में संकोच कर रहा हूं क्योंकि जाहिर है कि विभिन्न मोड में मेरे फोन पर "पिक्सेल" की कई धारणाएं हैं, और वे एक सुसंगत कहानी में नहीं जोड़ रहे हैं।

मुझे लगता है कि यह कहा गया है और स्टैक्वेरफ्लो और अन्य जगहों पर बहुत जवाब दिया गया है, लेकिन सभी में से कोई भी जवाब वास्तव में मेरे फोन पर काम नहीं करता है (droid 4, android 4.1.2)

(वाह!)

यह उस लाइब्रेरी कोड के लिए है, जिसे इस बात पर ध्यान दिए बिना काम करना होगा कि ऐप "स्क्रीन कम्पैटिबिलिटी मोड" में है (यानी टार्गेटसडक्रोवेशन <= 10 मैनिफ़ेस्ट में) या नहीं, और मैं पोज़िशन, साइज़ के बारे में कोई धारणा नहीं बनाना चाहता , या स्टेटस बार या किसी अन्य समान स्क्रीन सजावट का अस्तित्व।


यहाँ तथ्य हैं:

  1. मेरे फोन (एंड्रॉइड 4.1.2 पर चलने वाले एक droid 4) में 540x960 फिजिकल पिक्सल हैं, यानी थोड़े रंग के चमकदार डॉट्स।

  2. टच ईवेंट्स और व्यू मापों को देखने से वांछित इकाइयों में स्क्रीन का आकार 360x640 है, जब ऐप स्क्रीन कॉम्पिटिशन मोड में है, 540x960 ऐप जब स्क्रीन कॉम्पेटिटर मोड में नहीं है। ये वे नंबर हैं जिन्हें मुझे प्रोग्रामिक रूप से ढूंढने की ज़रूरत है, बिना टच इवेंट्स या व्यूज़ के साथ मूकिंग करने के लिए, लेकिन मुझे इन ऐप को वापस करने वाले किसी भी एपीआई को खोजने में अत्यधिक कठिनाई हो रही है।

  3. डिस्प्ले और डिस्प्लेमेट्रिक्स ऑब्जेक्ट विभिन्न तरीकों से प्राप्त किए गए हैं, सभी का दावा है कि स्क्रीन का आकार 540x960 "पिक्सेल" है (चाहे स्क्रीन कॉम्पिटिटर मोड में हो या नहीं)। विशिष्ट होने के लिए, निम्नलिखित सभी हर समय 540x960 कहते हैं: DisplayMetrics। {चौड़ाई, ऊँचाई} पिक्सेल, Display.getSize (), Display.getRealSize (), Display.get {चौड़ाई, ऊँचाई} (),

  4. विभिन्न प्रकार से प्राप्त कॉन्फ़िगरेशन ऑब्जेक्ट सभी स्क्रीन को कहते हैं {Width, Height} Dp = 360x614 (स्क्रीन कम्प्रेसर मोड में है या नहीं)। मुझे विश्वास नहीं है कि पहलू अनुपात गलत है, पूरी स्क्रीन का प्रतिनिधित्व करता है। (मुझे लगता है कि यह पूरी स्क्रीन माइनस बार है; मुझे पूरी स्क्रीन की आवश्यकता है।) मुझे लगता है कि यह कहना सुरक्षित है कि पूरी स्क्रीन 360x640 डीपी है, हालांकि मुझे ऐसा कोई एपीआई नहीं पता है जो उस 640 को लौटाए।

  5. विभिन्न तरीकों से प्राप्त DisplayMetrics का कहना है कि "घनत्व" 1.0f है जब स्क्रीन कॉम्पिटिटर मोड में, 1.5f जब स्क्रीन कम्प्रेसर मोड में नहीं।

  6. गतिविधि 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);
}

क्या स्क्रीन का आकार खोजने का कोई बेहतर / साफ-सुथरा तरीका है ??


29
+1 महान प्रश्न, और अनुसंधान प्रयासों का एक बहुत कुछ दिखाता है।
एलेक्स गिट्टिएर

1
@ डॉक्स में , यह समझाया गया है कि संगतता मोड पुराने सेटअपों पर "ज़ूम टू फिट" ऑपरेशन करना बंद कर देगा। हालाँकि यह स्पष्ट रूप से नहीं बताया गया है कि "यह कैसे काम करता है", आपकी टिप्पणियों से, मुझे लगता है कि वे बस घनत्व स्केलिंग बंद कर देते हैं, अर्थात: 1 पीएक्स 1 डीपी बन जाता है। यह हो सकता है कि यह परिवर्तन केवल रेंडरिंग भाग में हो, और DisplayMetricsऐसे परिवर्तनों के बारे में कभी अपडेट न किया गया हो। इस तरह के मुद्दे पहले से ही दर्ज हैं।
एसडी

@ user117 - दिलचस्प। DisplayMetrics का अच्छा हिस्सा कम से कम - घनत्व 1.0 में बदल गया है। लेकिन WidPixels / heightPixels मैच के लिए नहीं बदले, ऐसा लगता है। इस मुद्दे का हवाला देते हुए, यह ऐसा लगता है कि यह व्यवहार 3.1 व्यवहार पर वापस आ गया है (यानी मैं ऊंचाई देख रहा हूं। इसमें स्टेटस बार शामिल हैं ... लेकिन गलत इकाइयों में ऐसा लगता है)
डॉन हैच

@DonHatch धन्यवाद, कृपया - मैं वास्तव में StackExchange पर अजीब तरह से स्वागत नहीं करने के लिए एक विचारशील प्रश्न की प्रशंसा देने की कोशिश कर रहा था - ध्यान दें कि "वास्तविक" से अधिक प्रश्न होने पर जवाबों में कुछ भी नहीं मिलता है, (कम) ) विषय पर दर्शकों के ज्ञान की गुणवत्ता। अब, मैं अपने स्वयं के प्रश्नों को एक के बाद एक "वास्तविक नहीं" होने के कारण बंद कर सकता हूं, और हास्य की भावना मुझे विफल कर सकती है, लेकिन यह उन सवालों की तरह दिखना शुरू कर देता है जिनके लिए "अच्छा" प्राप्त करने वाले उत्तर वास्तव में हैं यह सब यहाँ के बारे में क्या हो जाता है ... और निश्चित रूप से, मैं तुम्हारा :) :)
mlvljr

btw! यहाँ मेरे संदेह की रेखाओं के साथ कुछ है: michael.richter.name/blogs/… (esp। देखें) उसका (1) बिंदु, जल्दी से तैयार किए गए उत्तरों पर एक - वास्तव में इस क्यू के साथ बस!)। हैप्पी एनवाई, वैसे भी (मेरा 11 मिनट में आता है)! :)
mlvljr

जवाबों:


41
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

अब आप अपने स्क्रीन साइज़ को पिक्सेल में माप सकते हैं जो सेंटीमीटर से बेहतर मापक इकाई है क्योंकि इस यूनिट में सभी बटन, टेक्स्ट आदि को मापा जाता है। जो कि मैं सामान्य रूप से उपयोग करता हूं


3
Op (बिंदु # 3 विशेष रूप से) के अनुसार, क्या यह स्क्रीन कम्प्रेसर मोड में गलत नहीं होगा?
टॉम

9

DisplayMetrics का उपयोग करके आप किसी भी डिवाइस की स्क्रीन की ऊंचाई और चौड़ाई प्राप्त कर सकते हैं। ध्यान दें कि चौड़ाई और ऊंचाई रोटेशन के प्रति संवेदनशील हैं। यहाँ कोड है।

DisplayMetrics metrics; 
int width = 0, height = 0;

अपने onCreate मेथड में

 metrics = new DisplayMetrics();        
 getWindowManager().getDefaultDisplay().getMetrics(metrics);

 height = Math.min(metrics.widthPixels, metrics.heightPixels); //height
 width = Math.max(metrics.widthPixels, metrics.heightPixels); //width

इसे इस्तेमाल करे।


2
नहीं, जैसा कि मैंने कहा (3), मैट्रिक्स। {चौड़ाई, ऊंचाई} पिक्सेल स्क्रीन संगतता मोड में सही जवाब नहीं दे रहे हैं।
डॉन हैच

इसके अलावा मुझे पता चला: ऐसा लगता है कि लाइट मेट्रिक्स।हाइट पिक्सल्स स्क्रीन को घुमाए जाने और इसके विपरीत होने पर चौड़ाई दे सकते हैं!
जॉनीटेक्स

8

अपने # 6 में, आप ध्यान दें कि डेकोरव्यू आपको प्रदान करने के लिए लगता है, लेकिन आपको नहीं लगता कि यह वास्तविक है। मेरा मानना ​​है कि आप जितने करीब आ सकते हैं। के लिए प्रलेखन के अनुसार Window.getDecorView:

शीर्ष-स्तरीय विंडो सजावट (मानक विंडो फ़्रेम / सजावट और उस के अंदर क्लाइंट की सामग्री युक्त) को पुनः प्राप्त करें, जिसे विंडो मैनेजर के रूप में विंडो में जोड़ा जा सकता है।

स्टेटस बार खिड़की की सजावट का एक हिस्सा है जिसका उल्लेख किया गया है। सॉफ़्टवेयर कीबोर्ड और अन्य ओवरले उनकी अपनी खिड़की प्राप्त करेंगे, इसलिए उन्हें प्रासंगिक मूल्यों के साथ हस्तक्षेप नहीं करना चाहिए। यह सही है कि डिस्प्ले मेट्रिक्स ठीक नहीं है, लेकिन यदि आपका एप्लिकेशन पूर्ण स्क्रीन है तो इसे हमेशा कम्प्लीट स्पायलेटर के माध्यम से फ़िल्टर किया हुआ पूर्ण स्क्रीन आकार होना चाहिए। अन्य एप्लिकेशन की आपके एप्लिकेशन तक पहुंच नहीं होगी Window, इसलिए कुछ अन्य ऐप के बारे में चिंता करने की आवश्यकता नहीं है, जबकि आप नहीं देख रहे हैं, तो विशेषताओं को बदल रहे हैं।

उम्मीद है की वो मदद करदे।


5

मुझे इसे एक टिप्पणी के रूप में रखना चाहिए लेकिन मेरे पास इसके लिए कोई प्रतिनिधि नहीं है।
यह पूरी तरह से सही उत्तर नहीं हो सकता है, लेकिन मुझे अपने आयाम मिले जब मैंने डिस्प्लेमेटिक्स विधि में ऊंचाई और चौड़ाई को स्विच किया।

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);   
    width = metrics.heightPixels;
    height = metrics.widthPixels;

जैसा कि मैंने कहा कि यह सही नहीं हो सकता है लेकिन मुझे नहीं पता कि यह मेरे लिए क्यों काम करता है।


ऐसा इसलिए है क्योंकि आपकी स्क्रीन ने मुझे विश्वास में घुमाया है।
जॉनीटेक्स

यह मुझ पर भरोसा नहीं था।
अभ्युदयश्रीनेट


3

मैंने Android फोन / टैबलेट स्क्रीन के विकर्ण आकार को खोजने के लिए पाइथागोरस प्रमेय का उपयोग किया है, वही प्रिंसिपल iPhone या ब्लैकबेरी स्क्रीन पर लागू किया जा सकता है।

DisplayMetrics met = new DisplayMetrics();                
this.getWindowManager().getDefaultDisplay().getMetrics(met);// get display metrics object
String strSize = 
new DecimalFormat("##.##").format(Math.sqrt(((met.widthPixels / met.xdpi) *
(met.widthPixels / met.xdpi)) +
((met.heightPixels / met.ydpi) * (met.heightPixels / met.ydpi))));
// using Dots per inches with width and height

पाइथागोरस एक जीनियस रहा होगा, वह इतने सालों पहले स्मार्ट फोन प्रोग्रामिंग जानता था: पी


1

मैं उपकरण की चौड़ाई प्राप्त करने के लिए नीचे दी गई विधि का उपयोग करता हूं:

public static int getDeviceWidth(Context context){
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    int width=display.getWidth();
    return width;
}

यह विधि पदावनत है। कृपया डिस्प्लेमेट्रिक्स विधि का उपयोग करें।
साइमन

0

मुझे लगता है कि यह फ़ंक्शन आपको बस अपने एंड्रॉइड स्क्रीन आकार की चौड़ाई और ऊंचाई प्राप्त करने में मदद करेगा। फ़ंक्शन पूर्णांक की एक सरणी के रूप में चौड़ाई और ऊंचाई देता है जैसा कि नीचे दिखाया गया है

private int[] getScreenSIze(){
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int h = displaymetrics.heightPixels;
        int w = displaymetrics.widthPixels;

        int[] size={w,h};
        return size;

    }

और आपके द्वारा बनाई गई विधि आउटपुट पर आपकी चौड़ाई और ऊँचाई नीचे दिखाए गए अनुसार

 int[] screenSize= getScreenSIze();
        int width=screenSize[0];
        int height=screenSize[1];
        screenSizes.setText("Phone Screen sizes \n\n  width = "+width+" \n Height = "+height);

स्रोत कोड डाउनलोड करें और इसे अपने एंड्रॉइड स्टूडियो पर परीक्षण करें


0

यह मेरे लिए काम करता है:

int width = Resources.getSystem ()। getDisplayMetrics ()। widthPixels;

int height = Resources.getSystem ()। getDisplayMetrics ()। heightPixels;

मैंने क्षैतिज पुनर्नवीनीकरण दृश्य में अपनी वस्तुओं की चौड़ाई को अपडेट करने के लिए इसका उपयोग किया। (मेरी आवश्यकता के अनुसार) आशा है कि यह किसी की मदद करता है!


-1

कोटलिन में इस समाधान के लिए , यह प्रयास करें:

private fun yourFunction(){
   val metrics = DisplayMetrics()
   windowManager.defaultDisplay.getMetrics(metrics)
   val width = metrics.widthPixels
   val height = metrics.heightPixels
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.