it-swarm.dev

كيفية الحصول على حجم شاشة أندرويد برمجياً ، مرة واحدة وإلى الأبد؟

كيف يمكنني معرفة حجم شاشتي بشكل برمجي ، في الوحدات المستخدمة بواسطة أحداث اللمس وعرض القياس/التخطيط؟ بمعنى آخر ، أريد إحداثيات الزاوية السفلية اليمنى من الشاشة ، في نظام الإحداثيات المستخدم بواسطة أحداث اللمس 'getRawX()/getRawY() و View.getLocationOnScreen().

أنا متردد في استدعاء وحدات الحدث/العرض المطلوبة "البكسل" ، حيث من الواضح أن هناك عدة مفاهيم لـ "وحدات البكسل" على هاتفي في أوضاع مختلفة ، وهي لا تضيف إلى قصة ثابتة.

أرى أن هذا قد تم طرحه والإجابة عليه كثيرًا على تدفق stackoverflow وفي أي مكان آخر ، ولكن لا شيء من الإجابات تعمل فعليًا على هاتفي (droid 4 ، Android 4.1.2) في جميع الأوضاع:

(رائع!)

هذا مخصص لرمز المكتبة الذي يحتاج إلى العمل بصرف النظر عما إذا كان التطبيق في "وضع توافق الشاشة" (على سبيل المثال targetSdkVersion <= 10 في البيان) أم لا ، ولا أريد أيضًا تقديم أي افتراضات حول الموضع والحجم أو وجود شريط الحالة أو أي ديكورات أخرى مماثلة للشاشة.


هذه هي الحقائق:

  1. يوجد في هاتفي (droid 4 الذي يعمل بنظام أندرويد 4.1.2) 540 × 960 بكسل ، أي نقاط صغيرة متوهجة ملونة.

  2. حجم الشاشة في الوحدات المطلوبة ، من النظر إلى أحداث اللمس وقياسات العرض ، هو 360 × 640 عندما يكون التطبيق في وضع توافق الشاشة ، 540 × 960 عندما لا يكون التطبيق في وضع توافق الشاشة. هذه هي الأرقام التي أحتاجها لإيجادها برمجيًا ، دون أن أتهاوى مع أحداث اللمس أو طرق العرض لإيجادها ، لكنني أجد صعوبة بالغة في العثور على أي واجهة برمجة التطبيقات التي من شأنها إرجاع هذه الأرقام.

  3. كائنات العرض و DisplayMetrics التي تم الحصول عليها بطرق مختلفة تدعي جميعها أن حجم الشاشة هو 540 × 960 "بكسل" (سواء في وضع توافق الشاشة أم لا). لتكون محددة ، كل ما يلي يقول 540 × 960 في كل وقت: DisplayMetrics. {width، height} Pixels، Display.getSize ()، Display.getRealSize ()، Display.get {Width، Height} ()،

  4. كائنات التكوين التي تم الحصول عليها بطرق مختلفة ، قل كلام الشاشة {Width، Height} Dp = 360x614 (سواء في وضع توافق الشاشة أم لا). لا أعتقد أن هذا يمثل الشاشة بأكملها ، لأن نسبة العرض إلى الارتفاع خاطئة. (أعتقد أنها الشاشة بأكملها مطروحًا من شريط الحالة ؛ أحتاج إلى الشاشة بأكملها.) أعتقد أنه من الآمن القول أن الشاشة بأكملها هي 360 × 640 بكسل ، على الرغم من أنني لا أعرف أي واجهة برمجة التطبيقات التي تُرجع ذلك الرقم 640.

  5. تقول DisplayMetrics التي تم الحصول عليها بطرق مختلفة أن "الكثافة" هي 1.0f عندما تكون في وضع التوافق مع الشاشة ، 1.5f عندما لا تكون في وضع التوافق مع الشاشة.

  6. نشاط getWindow().getAttributes().{width,height} ليس مفيدًا لأنه يحتوي عادةً على MATCH_PARENT بدلاً من الأحجام الفعلية. لكن يبدو لي أنه من الممكن الحصول على الإجابة المطلوبة من وظيفة getWindow().getDecorView().getMeasured{Width,Height}() (وهو ما يثير الدهشة في الواقع لأن ديكور النافذة الخاص بالنشاط لا انظر مثل أنه يشغل الشاشة بأكملها ؛ يبدو أنه يشغل الشاشة ناقص شريط الحالة). لكنني لا أريد الاعتماد على هذا لأنه إذا تم تغيير حجم النافذة من أي وقت مضى (تظهر لوحة مفاتيح ناعمة؟ شخص ما يتصل بـ window.setAttributes () أو ربما لست في نشاط على الإطلاق) ، فمن الواضح أن هذا سيكون جميعًا خطأ.

أفهم أن الصيغة التالية من المفترض أن تحتوي على: بكسلات = dp * الكثافة ويبدو أنها تتفق مع جميع الأرقام المبلغ عنها ((3) ، (4) ، (5) أعلاه) عندما لا في وضع توافق الشاشة : 540x960 = 360x640 * 1.5 ولكن في وضع توافق الشاشة ، لا تضيف ما يصل: 540x960! = 360x640 * 1 لذلك ، هناك شيء غريب.

أعتقد أن أبسط تفسير هو أن الأساليب المذكورة في (3) أعلاه تعطي ببساطة إجابة خاطئة عن "وحدات البكسل" عندما تكون في وضع توافق الشاشة - أي أنها كانت تهدف إلى إرجاع 360 × 640 "بكسل" لكنها خاطئة إرجاع 540 × 960 بدلاً من ذلك. ولكن قد تكون هناك طرق أخرى للنظر في ذلك.

في أي حال ، فإن الحصول على الأرقام المطلوبة بغض النظر عن الوضع ، من قطع الألغاز المذكورة أعلاه ، هو بالتأكيد لغز صعب. لقد وجدت طريقة تبدو وكأنها تعمل على هاتفي في كلا الوضعين ، لكنها حلبة للغاية ، وتعتمد على افتراضين لا يزالان يبدوان هشين (كما هو موضح في تعليقات الكود أدناه).

هنا وصفتي:

/** 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);
}

هل هناك أي طريقة أفضل/أنظف للعثور على حجم الشاشة؟

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

يمكنك الآن قياس حجم الشاشة بالبكسل وهي وحدة قياس أفضل من السنتيمتر لأن جميع الأزرار ووجهات النظر النصية وغيرها تقاس في هذه الوحدة. هذا ما أستخدمه بشكل طبيعي

41
Cobra47

باستخدام DisplayMetrics ، يمكنك الحصول على ارتفاع وعرض شاشة أي جهاز. هنا هو الرمز.

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

في طريقة onCreate الخاصة بك

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


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

جرب هذا.

8
Preet_Android

في رقم 6 الخاص بك ، لاحظت أن DecorView توفر ما تريد ، لكنك لا تعتقد أنه قابل للتحقيق. أعتقد أن هذا أقرب ما يمكن. وفقًا لوثائق Window.getDecorView:

استرجع طريقة عرض نافذة المستوى الأعلى (التي تحتوي على إطار/ديكورات النافذة القياسية ومحتوى العميل داخل ذلك) ، والتي يمكن إضافتها كنافذة إلى مدير النوافذ.

شريط الحالة هو جزء من زخرفة النافذة المذكورة هناك. ستتلقى لوحات المفاتيح الخاصة بالبرامج والتراكبات الأخرى نافذتها الخاصة ، لذلك يجب ألا تتداخل مع القيم ذات الصلة. صحيح أنه ليس بالضبط مقاييس العرض ، ولكن إذا كان التطبيق الخاص بك ممتلئًا ، فيجب دائمًا ترشيح حجم الشاشة بالكامل من خلال مترجم التوافق. لن تتمكن التطبيقات الأخرى من الوصول إلى Window الخاص بالتطبيق الخاص بك ، لذلك لا داعي للقلق بشأن قيام بعض التطبيقات الأخرى بتغيير السمات أثناء عدم البحث.

امل ان يساعد.

8
Dave

يجب أن أضع هذا كتعليق ولكن ليس لدي مندوب لذلك.
قد لا تكون هذه إجابة صحيحة تمامًا ، لكنني حصلت على أبعادي عندما قمت بتبديل الطول والعرض في طريقة DisplayMetrics.

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

كما قلت هذا قد لا يكون صحيحًا ، لكنني لا أعرف السبب ولكنه نجح بالنسبة لي.

4
Otaku

إذا كنت تستخدم مستوى api 17 أو أعلى ، فقم بزيارة getRealMetrics و getRealSize في العرض

بالنسبة لمستوى api 14 و 15 و 16 ، انظر هنا

3
Exoit

لقد استخدمت نظرية فيثاغورس للعثور على الحجم المائل لشاشة الهاتف/الكمبيوتر اللوحي التي تعمل بنظام Android ، ويمكن تطبيق نفس المبدأ على شاشة iPhone أو Blackberry.

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

لقد كان فيثاغورس عبقريًا ، فقد كان يعرف برمجة الهواتف الذكية منذ عدة سنوات: p

3
Naeem A. Malik

أستخدم الطريقة أدناه للحصول على عرض الجهاز:

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

أعتقد أن هذه الوظيفة ستساعدك في الحصول على عرض وارتفاع حجم شاشة 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);

قم بتنزيل الكود المصدريواختبره على استوديو الأندرويد الخاص بك

0
Daniel Nyamasyo