xxhdpi - support multiple screens android




الحصول على أبعاد الشاشة بالبكسل (20)

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

int px = screenWidth - m;
int py = screenHeight - n;

كيف يمكنني الحصول على screenHeight وعرض screenHeight في النشاط الرئيسي؟


(إجابة 2012 ، قد تكون قديمة) إذا كنت تريد دعم ما قبل قرص العسل ، فستحتاج إلى وضع التوافق مع الإصدارات السابقة قبل API 13. شيء من هذا القبيل:

int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    Point size = new Point();
    w.getDefaultDisplay().getSize(size);
    measuredWidth = size.x;
    measuredHeight = size.y;
} else {
    Display d = w.getDefaultDisplay();
    measuredWidth = d.getWidth();
    measuredHeight = d.getHeight();
}

وبالطبع ، سيتم أخيرًا التخلص من الأساليب التي تم إيقاف العمل بها من أحدث حزم SDK ، ولكن في حين أننا لا نزال نعتمد على معظم مستخدمينا الذين لديهم Android 2.1 و 2.2 و 2.3 ، فهذا ما تبقى لنا.


أبسط طريقة:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

أولا الحصول على عرض (على سبيل المثال. عن طريق findViewById() ) وبعد ذلك يمكنك استخدام getWidth() على وجهة النظر نفسها.


أولاً قم بتحميل ملف XML ثم اكتب هذا الرمز:

setContentView(R.layout.main);      
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());

إظهار العرض والارتفاع وفقًا لدقة الشاشة.


إذا كنت لا ترغب في زيادة عدد نوافذ WindowManagers أو Points أو Displays ، فيمكنك الحصول على سمات الارتفاع والعرض لأعلى عنصر عرض في XML ، بشرط أن يتم تعيين ارتفاعه وعرضه على match_parent. (هذا صحيح طالما أن التخطيط الخاص بك يشغل الشاشة بأكملها.)

على سبيل المثال ، إذا كان XML الخاص بك يبدأ بشيء مثل هذا:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/entireLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

ثم findViewById(R.id.entireLayout).getWidth() سيعود عرض الشاشة و findViewById(R.id.entireLayout).getHeight() سيعود ارتفاع الشاشة.


ابحث عن عرض وارتفاع الشاشة:

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

باستخدام هذا ، يمكننا الحصول على أحدث وأكبر SDK 13.

// New width and height
int version = android.os.Build.VERSION.SDK_INT;
Log.i("", " name == "+ version);
Display display = getWindowManager().getDefaultDisplay();
int width;
if (version >= 13) {
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    Log.i("width", "if =>" +width);
}
else {
    width = display.getWidth();
    Log.i("width", "else =>" +width);
}

استخدام التعليمة البرمجية التالية في النشاط.

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

بالنسبة إلى من يبحث عن بُعد شاشة قابل للاستخدام بدون شريط الحالة وشريط الإجراءات (أيضًا بفضل إجابة Swapnil):

DisplayMetrics dm = getResources().getDisplayMetrics();
float screen_w = dm.widthPixels;
float screen_h = dm.heightPixels;

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    screen_h -= getResources().getDimensionPixelSize(resId);
}

TypedValue typedValue = new TypedValue();
if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)){
    screen_h -= getResources().getDimensionPixelSize(typedValue.resourceId);
}

قد لا يجيب على سؤالك ، ولكن قد يكون من المفيد أن نعرف (كنت أبحث عنه بنفسي عندما جئت إلى هذا السؤال) أنه إذا كنت بحاجة إلى بُعد View ولكن يتم تنفيذ التعليمات البرمجية الخاصة بك عندما لم يتم تخطيطه بعد (على سبيل المثال في onCreate() ) يمكنك إعداد ViewTreeObserver.OnGlobalLayoutListener مع View.getViewTreeObserver().addOnGlobalLayoutListener() ووضع التعليمات البرمجية ذات الصلة التي تحتاج إلى بعد العرض هناك. سيتم استدعاء معاودة الاتصال بالمستمع عندما يكون المخطط قد تم وضعه.


لدي نشاط شاشة البداية مع LinearLayout كطريقة عرض الجذر التي لها match_parent للعرض والارتفاع. هذا هو الرمز في طريقة onCreate() لهذا النشاط. أنا استخدم هذه التدابير في جميع الأنشطة الأخرى للتطبيق.

int displayWidth = getRawDisplayWidthPreHoneycomb();
int rawDisplayHeight = getRawDisplayHeightPreHoneycomb();
int usableDisplayHeight = rawDisplayHeight - getStatusBarHeight();
pf.setScreenParameters(displayWidth, usableDisplayHeight);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    LinearLayout myView = (LinearLayout) findViewById(R.id.splash_view);
    myView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
            if (left == 0 && top == 0 && right == 0 && bottom == 0) {
                return;
            }
            int displayWidth = Math.min(right, bottom);
            int usableDisplayHeight = Math.max(right, bottom);
            pf.setScreenParameters(displayWidth, usableDisplayHeight);
        }
    });
}

في ما يلي تطبيقات الطرق التي تراها تتم دعوتك أعلاه:

private int getRawDisplayWidthPreHoneycomb() {
    WindowManager windowManager = getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);

    int widthPixels = displayMetrics.widthPixels;
    int heightPixels = displayMetrics.heightPixels;

    return Math.min(widthPixels, heightPixels);
}

private int getRawDisplayHeightPreHoneycomb() {
    WindowManager w = getWindowManager();
    Display d = w.getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    d.getMetrics(metrics);

    int widthPixels = metrics.widthPixels;
    int heightPixels = metrics.heightPixels;

    return Math.max(widthPixels, heightPixels);
}

public int getStatusBarHeight() {
    int statusBarHeight = 0;

    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        statusBarHeight = getResources().getDimensionPixelSize(resourceId);
    }

    return statusBarHeight;
}

يؤدي هذا إلى ارتفاع وعرض الشاشة القابلة للاستخدام ، باستثناء أي نوع من الأشرطة (شريط الحالة ، شريط التنقل) ، لجميع إصدارات API والأنواع المختلفة من الأجهزة (الهواتف والأجهزة اللوحية).


لقد جربت كل "الحلول" الممكنة دون جدوى ، ولاحظت أن تطبيق Elliott Hughes "Dalvik Explorer" يعرض دائمًا البُعد الصحيح على أي إصدار من جهاز / نظام Android. انتهى بي الأمر بالنظر إلى مشروع المصدر المفتوح الذي يمكن العثور عليه هنا: https://code.google.com/p/enh/

هنا جميع التعليمات البرمجية ذات الصلة:

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

تعديل: نسخة محسنة قليلاً (تجنب استثناءات التشغيل في إصدار نظام التشغيل غير المدعوم):

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

لقد وجدت هذا فعل الخدعة.

Rect dim = new Rect();
getWindowVisibleDisplayFrame(dim);

للحصول على أبعاد الشاشة ، استخدم metrices العرض

DisplayMetrics displayMetrics = new DisplayMetrics();
if (context != null) 
      WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
      Display defaultDisplay = windowManager.getDefaultDisplay();
      defaultDisplay.getRealMetrics(displayMetrics);
    }

احصل على الارتفاع والعرض بالبكسل

int width  =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;

للوصول إلى ارتفاع شريط الحالة لأجهزة Android ، نفضل طريقة برمجية للحصول عليه:

عينة من الرموز

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

تعطي result المتغيرة الارتفاع في البكسل.

للوصول السريع

لمزيد من المعلومات حول ارتفاع Title bar Navigation bar وعرض Content View ، يرجى إلقاء نظرة على أحجام شاشة جهاز Android .


هذه ليست إجابة على البروتوكول الاختياري ، لأنه يريد أبعاد العرض في البكسلات الحقيقية. كنت أرغب في الأبعاد في "جهاز مستقل عن البكسل" ، ووضع الإجابات من هنا https://.com/a/17880012/253938 وهنا https://.com/a/6656774/253938 لقد صعدت مع هذا:

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);
    int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5);

هذه هي الشفرة التي أستخدمها للمهمة:

// `activity` is an instance of Activity class.
Display display = activity.getWindowManager().getDefaultDisplay();
Point screen = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    display.getSize(screen);
} else {            
    screen.x = display.getWidth();
    screen.y = display.getHeight();
}

يبدو نظيفة بما فيه الكفاية ، ومع ذلك ، يعتني deprecation.


هناك طريقة غير موقوفة للقيام بذلك باستخدام DisplayMetrics (API 1) ، والتي تتجنب فوضى المحاولة / التقاط:

 // initialize the DisplayMetrics object
 DisplayMetrics deviceDisplayMetrics = new DisplayMetrics();

 // populate the DisplayMetrics object with the display characteristics
 getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics);

 // get the width and height
 screenWidth = deviceDisplayMetrics.widthPixels;
 screenHeight = deviceDisplayMetrics.heightPixels;

وأود أن التفاف رمز getSize مثل هذا:

@SuppressLint("NewApi")
public static Point getScreenSize(Activity a) {
    Point size = new Point();
    Display d = a.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        d.getSize(size);
    } else {
        size.x = d.getWidth();
        size.y = d.getHeight();
    }
    return size;
}

يمكنك الحصول على حجم الارتفاع باستخدام:

getResources().getDisplayMetrics().heightPixels;

وحجم العرض باستخدام

getResources().getDisplayMetrics().widthPixels; 

DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;




dimensions