2013-07-05 3 views
115

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

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

मैं देख रहा हूँ इस लिए कहा गया है और stackoverflow पर एक बहुत के जवाब दिए और कहीं और, लेकिन जवाब में से कोई भी वास्तव में सभी साधनों में मेरे फोन (ड्रायड 4, एंड्रॉयड 4.1.2) पर काम करते हैं:

(वाह!)

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

  1. मेरे फोन (एक droid 4 एंड्रॉयड 4.1.2 चल) 540x960 पिक्सल शारीरिक, अर्थात छोटे रंगीन चमक डॉट्स है:


    यहाँ तथ्य हैं। जब एप्लिकेशन स्क्रीन compat मोड में नहीं है

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

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

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

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

  6. गतिविधि के क्योंकि इसे आमतौर पर वास्तविक आकार के बजाय 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); 
} 

वहाँ किसी भी बेहतर/क्लीनर रास्ता स्क्रीन के आकार को खोजने के लिए है ??

+24

+1 ग्रेट सवाल, और बहुत सारे शोध प्रयास दिखाता है। –

+1

@ डॉन इन [डॉक्स] (http://developer.android.com/guide/practices/screen-compat-mode.html), यह समझाया गया है कि संगतता मोड पुराने सेटअप पर "फिट करने के लिए ज़ूम" करने से रोक देगा। हालांकि, यह स्पष्ट रूप से स्पष्ट नहीं है कि "यह कैसे काम करता है", आपके अवलोकनों से, मुझे लगता है कि वे घनत्व स्केलिंग को बंद कर देते हैं, यानी 1px 1 डीपी बन जाता है। यह हो सकता है कि यह परिवर्तन केवल प्रतिपादन भाग में है, और 'DisplayMetrics' को ऐसे परिवर्तनों से कभी अपडेट नहीं किया गया है। [इस] (http://code.google.com/p/android/issues/detail?id=19921) पहले से ही दायर किए गए मुद्दे हैं। –

+0

@ user117 - दिलचस्प। प्रदर्शन मेट्रिक्स का खैर * भाग * कम से कम अपडेट किया गया - घनत्व 1.0 में बदल गया। लेकिन चौड़ाई पिक्सेल/ऊंचाई पिक्सल को मिलान में नहीं बदला गया, ऐसा लगता है। इस मुद्दे के बारे में उद्धृत किया गया है, ऐसा लगता है कि व्यवहार 3.1 व्यवहार में वापस आ गया है (यानी मैं ऊंचाई पिक्सेल * देख रहा हूं * स्टेटस बार शामिल है ... लेकिन गलत इकाइयों में ऐसा लगता है) –

उत्तर

7

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

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

अपने onCreate विधि

में
metrics = new DisplayMetrics();   
getWindowManager().getDefaultDisplay().getMetrics(metrics); 


height = metrics.heightPixels;  
width = metrics.widthPixels; 

इस प्रयास करें।

+1

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

6

अपने # 6 में, आप ध्यान दें कि DecorView करने लगता है getRealMetrics और getRealSize की जाँच Display

में एपीआई स्तर के लिए एपीआई स्तर 17 उपयोग कर रहे हैं या तो जो भी आप चाहते हैं उसे प्रदान करें, लेकिन आपको नहीं लगता कि यह वास्तविक है। मेरा मानना ​​है कि आप जितना करीब आ सकते हैं उतना करीब है। Window.getDecorView के लिए प्रलेखन के अनुसार:

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

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

उम्मीद है कि मदद करता है।

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

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

+2

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

2

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

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 

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

3

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

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

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

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

यह विधि बहिष्कृत है। कृपया प्रदर्शन मेट्रिक्स विधि का उपयोग करें। – Simon

0

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

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); 

Download source code दिखाया गया है और पर उसकी जांच अपने एंड्रॉइड स्टूडियो

संबंधित मुद्दे

 संबंधित मुद्दे