Schermbreedte en hoogte krijgen in Android

Hoe kan ik de breedte en hoogte van het scherm krijgen en deze waarde gebruiken in:

@Override protected void onMeasure(int widthSpecId, int heightSpecId) {
    Log.e(TAG, "onMeasure" + widthSpecId);
    setMeasuredDimension(SCREEN_WIDTH, SCREEN_HEIGHT - 
        game.findViewById(R.id.flag).getHeight());
}

Antwoord 1, autoriteit 100%

Met deze code kunt u de breedte & hoogte:

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

In een weergave moet je zoiets als dit doen:

((Activity) getContext()).getWindowManager()
                         .getDefaultDisplay()
                         .getMetrics(displayMetrics);

In sommige scenario’s, waar apparaten een navigatiebalk hebben, moet u tijdens runtime controleren:

public boolean showNavigationBar(Resources resources)
{
    int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
    return id > 0 && resources.getBoolean(id);
}

Als het apparaat een navigatiebalk heeft, tel dan de hoogte:

private int getNavigationBarHeight() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int usableHeight = metrics.heightPixels;
        getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
        int realHeight = metrics.heightPixels;
        if (realHeight > usableHeight)
            return realHeight - usableHeight;
        else
            return 0;
    }
    return 0;
}

Dus de uiteindelijke hoogte van het apparaat is:

int height = displayMetrics.heightPixels + getNavigationBarHeight();

Antwoord 2, autoriteit 29%

Er is een heel eenvoudig antwoord en zonder pass-context

public static int getScreenWidth() {
    return Resources.getSystem().getDisplayMetrics().widthPixels;
}
public static int getScreenHeight() {
    return Resources.getSystem().getDisplayMetrics().heightPixels;
}

Opmerking: als u de hoogte inclusief navigatiebalk wilt, gebruik dan onderstaande methode

WindowManager windowManager =
        (WindowManager) BaseApplication.getApplication().getSystemService(Context.WINDOW_SERVICE);
    final Display display = windowManager.getDefaultDisplay();
    Point outPoint = new Point();
    if (Build.VERSION.SDK_INT >= 19) {
        // include navigation bar
        display.getRealSize(outPoint);
    } else {
        // exclude navigation bar
        display.getSize(outPoint);
    }
    if (outPoint.y > outPoint.x) {
        mRealSizeHeight = outPoint.y;
        mRealSizeWidth = outPoint.x;
    } else {
        mRealSizeHeight = outPoint.x;
        mRealSizeWidth = outPoint.y;
    }

Antwoord 3, autoriteit 4%

Alleen om het antwoord van parag en SpK bij te werken om af te stemmen op de huidige achterwaartse compatibiliteit van SDK van verouderde methoden:

int Measuredwidth = 0;  
int Measuredheight = 0;  
Point size = new Point();
WindowManager w = getWindowManager();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)    {
    w.getDefaultDisplay().getSize(size);
    Measuredwidth = size.x;
    Measuredheight = size.y; 
}else{
    Display d = w.getDefaultDisplay(); 
    Measuredwidth = d.getWidth(); 
    Measuredheight = d.getHeight(); 
}

Antwoord 4, autoriteit 2%

Waarom niet

DisplayMetrics displaymetrics = getResources().getDisplayMetrics();

gebruik dan

displayMetrics.widthPixels (heightPixels)


Antwoord 5, autoriteit 2%

Het is heel gemakkelijk om in Android te komen:

int width  = Resources.getSystem().getDisplayMetrics().widthPixels;
int height = Resources.getSystem().getDisplayMetrics().heightPixels;

Antwoord 6

Kotlin Versionvia Extension Property

Als u zowel de grootte van het scherm in pixels als dpwilt weten, helpt het gebruik van deze extensie-eigenschappen echt:

DimensionUtils .kt

import android.content.Context
import android.content.res.Resources
import android.graphics.Rect
import android.graphics.RectF
import android.os.Build
import android.util.DisplayMetrics
import android.view.WindowManager
import kotlin.math.roundToInt
/**
 * @author aminography
 */
private val displayMetrics: DisplayMetrics by lazy { Resources.getSystem().displayMetrics }
/**
 * Returns boundary of the screen in pixels (px).
 */
val screenRectPx: Rect
    get() = displayMetrics.run { Rect(0, 0, widthPixels, heightPixels) }
/**
 * Returns boundary of the screen in density independent pixels (dp).
 */
val screenRectDp: RectF
    get() = screenRectPx.run { RectF(0f, 0f, right.px2dp, bottom.px2dp) }
/**
 * Returns boundary of the physical screen including system decor elements (if any) like navigation
 * bar in pixels (px).
 */
val Context.physicalScreenRectPx: Rect
    get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        (applicationContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager)
            .run { DisplayMetrics().also { defaultDisplay.getRealMetrics(it) } }
            .run { Rect(0, 0, widthPixels, heightPixels) }
    } else screenRectPx
/**
 * Returns boundary of the physical screen including system decor elements (if any) like navigation
 * bar in density independent pixels (dp).
 */
val Context.physicalScreenRectDp: RectF
    get() = physicalScreenRectPx.run { RectF(0f, 0f, right.px2dp, bottom.px2dp) }
/**
 * Converts any given number from pixels (px) into density independent pixels (dp).
 */
val Number.px2dp: Float
    get() = this.toFloat() / displayMetrics.density
/**
 * Converts any given number from density independent pixels (dp) into pixels (px).
 */
val Number.dp2px: Int
    get() = (this.toFloat() * displayMetrics.density).roundToInt()

Gebruik:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val widthPx = screenRectPx.width()
        val heightPx = screenRectPx.height()
        println("[PX] screen width: $widthPx , height: $heightPx")
        val widthDp = screenRectDp.width()
        val heightDp = screenRectDp.height()
        println("[DP] screen width: $widthDp , height: $heightDp")
        println()
        val physicalWidthPx = physicalScreenRectPx.width()
        val physicalHeightPx = physicalScreenRectPx.height()
        println("[PX] physical screen width: $physicalWidthPx , height: $physicalHeightPx")
        val physicalWidthDp = physicalScreenRectDp.width()
        val physicalHeightDp = physicalScreenRectDp.height()
        println("[DP] physical screen width: $physicalWidthDp , height: $physicalHeightDp")
    }
}

Resultaat:

Als het apparaat zich in de richting portraitbevindt:

[PX] screen width: 1440 , height: 2392
[DP] screen width: 360.0 , height: 598.0
[PX] physical screen width: 1440 , height: 2560
[DP] physical screen width: 360.0 , height: 640.0

Als het apparaat zich in de richting landscapebevindt:

[PX] screen width: 2392 , height: 1440
[DP] screen width: 598.0 , height: 360.0
[PX] physical screen width: 2560 , height: 1440
[DP] physical screen width: 640.0 , height: 360.0

Antwoord 7

Probeer onderstaande code:-

1.

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

2.

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated

of

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

3.

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

Antwoord 8

DisplayMetrics lDisplayMetrics = getResources().getDisplayMetrics();
int widthPixels = lDisplayMetrics.widthPixels;
int heightPixels = lDisplayMetrics.heightPixels;

Antwoord 9

Voor gebruikers van kotlin

fun Activity.displayMetrics(): DisplayMetrics {
   val displayMetrics = DisplayMetrics()
   windowManager.defaultDisplay.getMetrics(displayMetrics)
   return displayMetrics
}

En in Activiteit zou je het kunnen gebruiken als

    resources.displayMetrics.let { displayMetrics ->
        val height = displayMetrics.heightPixels
        val width = displayMetrics.widthPixels
    }

Of in fragment

   activity?.displayMetrics()?.run {
        val height = heightPixels
        val width = widthPixels
    }

Antwoord 10

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

Antwoord 11

De waarde van de schermbreedte en -hoogte ophalen.

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

Antwoord 12

Geen van de antwoorden hier werkt correct voor meerdere Chrome OS-schermen of binnenkort te verschijnen Foldables.

Gebruik bij het zoeken naar de huidige configuratie altijd de configuratie van uw huidige activiteit in getResources().getConfiguration(). Gebruik niet de configuratie van uw achtergrondactiviteit of die van de systeembron.De achtergrondactiviteit heeft geen grootte, en de systeemconfiguratie kan meerdere vensters bevatten met tegenstrijdige afmetingen en richtingen, dus er kunnen geen bruikbare gegevens worden geëxtraheerd.

Dus het antwoord is

val config = context.getResources().getConfiguration()
val (screenWidthPx, screenHeightPx) = config.screenWidthDp.dp to config.screenHeightDp.dp

Antwoord 13

Volledige manier om het te doen, dat geeft de ware resolutie terug:

           WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Point size = new Point();
            wm.getDefaultDisplay().getRealSize(size);
            final int width = size.x, height = size.y;

En aangezien dit bij verschillende oriëntaties kan veranderen, is hier een oplossing (in Kotlin), om het goed te krijgen, ongeacht de oriëntatie:

/**
 * returns the natural orientation of the device: Configuration.ORIENTATION_LANDSCAPE or Configuration.ORIENTATION_PORTRAIT .<br></br>
 * The result should be consistent no matter the orientation of the device
 */
@JvmStatic
fun getScreenNaturalOrientation(context: Context): Int {
    //based on : http://stackoverflow.com/a/9888357/878126
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val config = context.resources.configuration
    val rotation = windowManager.defaultDisplay.rotation
    return if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && config.orientation == Configuration.ORIENTATION_LANDSCAPE || (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && config.orientation == Configuration.ORIENTATION_PORTRAIT)
        Configuration.ORIENTATION_LANDSCAPE
    else
        Configuration.ORIENTATION_PORTRAIT
}
/**
 * returns the natural screen size (in pixels). The result should be consistent no matter the orientation of the device
 */
@JvmStatic
fun getScreenNaturalSize(context: Context): Point {
    val screenNaturalOrientation = getScreenNaturalOrientation(context)
    val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val point = Point()
    wm.defaultDisplay.getRealSize(point)
    val currentOrientation = context.resources.configuration.orientation
    if (currentOrientation == screenNaturalOrientation)
        return point
    else return Point(point.y, point.x)
}

Antwoord 14

Als een Android-officieel document zei voor het standaard display-gebruik context # getDisplay () omdat deze methode is verouderd in API-niveau 30.

GetwindowManager (). GetDefaultDisplayPlay (). Getmetrics (displaymetrics);

Hieronder vermeld deze code is in Kotlin en is geschreven CODUDING naar de nieuwste versie van Android-help u Bepaal de breedte en hoogte:

fun getWidth(context: Context): Int {
    var width:Int = 0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val displayMetrics = DisplayMetrics()
        val display: Display? = context.getDisplay()
        display!!.getRealMetrics(displayMetrics)
        return displayMetrics.widthPixels
    }else{
        val displayMetrics = DisplayMetrics()
        this.windowManager.defaultDisplay.getMetrics(displayMetrics)
        width = displayMetrics.widthPixels
        return width
    }
}
fun getHeight(context: Context): Int {
    var height: Int = 0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val displayMetrics = DisplayMetrics()
        val display = context.display
        display!!.getRealMetrics(displayMetrics)
        return displayMetrics.heightPixels
    }else {
        val displayMetrics = DisplayMetrics()
        this.windowManager.defaultDisplay.getMetrics(displayMetrics)
        height = displayMetrics.heightPixels
        return height
    }
}

Antwoord 15

Display display = ((WindowManager) this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int mWidthScreen = display.getWidth();
int mHeightScreen = display.getHeight();

Antwoord 16

public class DisplayInfo {
    int screen_height=0, screen_width=0;
    WindowManager wm;
    DisplayMetrics displaymetrics;
    DisplayInfo(Context context) {
        getdisplayheightWidth(context);
    }
    void getdisplayheightWidth(Context context) {
        wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        displaymetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(displaymetrics);
        screen_height = displaymetrics.heightPixels;
        screen_width = displaymetrics.widthPixels;
    }
    public int getScreen_height() {
        return screen_height;
    }
    public int getScreen_width() {
        return screen_width;
    }
}

Antwoord 17

Ik gebruik de volgende code om de schermafmetingen te krijgen

getWindow().getDecorView().getWidth()
getWindow().getDecorView().getHeight()

Antwoord 18

De hier getoonde methoden zijn verouderd/verouderd, maar dit werkt nog steeds. API 13 vereist

bekijk het eens

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

Antwoord 19

Zoals een officieel Android-document voor de standaardweergave zei, gebruik Context#getDisplay() omdat deze methode is verouderd in API-niveau 30.

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

Deze schaal met code helpt bij het bepalen van de breedte en hoogte.

public static int getWidth(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    Display display = context.getDisplay();
    if (display != null) {
        display.getRealMetrics(displayMetrics);
        return displayMetrics.widthPixels;
    }
    return -1;
}

Voor de hoogte:

public static int getHeight(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    Display display = context.getDisplay();
    if (display != null) {
        display.getRealMetrics(displayMetrics);
        return displayMetrics.heightPixels;
    }
    return -1;
}

Antwoord 20

Probeer deze code voor Kotlin

val display = windowManager.defaultDisplay
 val size = Point()
 display.getSize(size)
 var DEVICE_WIDTH = size.x
 var DEVICE_HEIGHT = size.y

Antwoord 21

U kunt de breedte en hoogte verkrijgen uit context

java:

 int width= context.getResources().getDisplayMetrics().widthPixels;
  int height= context.getResources().getDisplayMetrics().heightPixels;

kotlin

   val width: Int = context.resources.displayMetrics.widthPixels
    val height: Int = context.resources.displayMetrics.heightPixels

Antwoord 22

Omdat getMetrics en getRealMetrics zijn verouderd, raadt Google aan om de schermbreedte en -hoogte als volgt te bepalen:

WindowMetrics windowMetrics = getActivity().getWindowManager().getMaximumWindowMetrics();
Rect bounds = windowMetrics.getBounds();
int widthPixels = bounds.width();
int heightPixels = bounds.height();

Ik heb echter een andere methode bedacht die me dezelfde resultaten geeft:

Configuration configuration = mContext.getResources().getConfiguration();
Display.Mode mode = display.getMode();
int widthPixels = mode.getPhysicalWidth();
int heightPixels = mode.getPhysicalHeight();

Antwoord 23

Gebruik gewoon de onderstaande functie die de breedte en hoogte van de schermgrootte retourneert als een array van gehele getallen

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

Klik op uw onCreate-functie of klik op de volgende code om de schermformaten uit te voeren zoals hieronder weergegeven

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

Antwoord 24

Ik vond het antwoord van weiganhet beste op deze pagina, hier is hoe je dat kunt gebruiken in Xamarin.Android:

public int GetScreenWidth()
{
    return Resources.System.DisplayMetrics.WidthPixels;
}
public int GetScreenHeight()
{
    return Resources.System.DisplayMetrics.HeightPixels;
}

Antwoord 25

De schermresolutie is het totale aantal pixels in het scherm. Het volgende programma zal de schermresolutie van het apparaat extraheren. Het zal de breedte en hoogte van het scherm afdrukken. Die waarden zijn in pixel.

public static Point getScreenResolution(Context context) {
// get window managers
WindowManager manager =  (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
Point point = new Point();
display.getSize(point);
 // get width and height
 int width = point.x;
 int height = point.y;
 return point;

}


Antwoord 26

   int getScreenSize() {
        int screenSize = getResources().getConfiguration().screenLayout &
                Configuration.SCREENLAYOUT_SIZE_MASK;
//        String toastMsg = "Screen size is neither large, normal or small";
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        int orientation = display.getRotation();
        int i = 0;
        switch (screenSize) {
            case Configuration.SCREENLAYOUT_SIZE_NORMAL:
                i = 1;
//                toastMsg = "Normal screen";
                break;
            case Configuration.SCREENLAYOUT_SIZE_SMALL:
                i = 1;
//                toastMsg = "Normal screen";
                break;
            case Configuration.SCREENLAYOUT_SIZE_LARGE:
//                toastMsg = "Large screen";
                if (orientation == Surface.ROTATION_90
                        || orientation == Surface.ROTATION_270) {
                    // TODO: add logic for landscape mode here
                    i = 2;
                } else {
                    i = 1;
                }
                break;
            case Configuration.SCREENLAYOUT_SIZE_XLARGE:
                if (orientation == Surface.ROTATION_90
                        || orientation == Surface.ROTATION_270) {
                    // TODO: add logic for landscape mode here
                    i = 4;
                } else {
                    i = 3;
                }
                break;
        }
//        customeToast(toastMsg);
        return i;
    }

Antwoord 27

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

Dit kan in sommige gevallen niet werken. voor de getametrics reacties :

krijgt weergave-statistieken die de grootte en de dichtheid hiervan beschrijven
Scherm. De maat geretourneerd door deze methode is niet noodzakelijk
vertegenwoordigen de werkelijke grondgrootte (native resolutie) van het display.

  1. De geretourneerde grootte kan worden aangepast om bepaalde systeemdecorementen uit te sluiten die altijd zichtbaar zijn.

  2. Het kan worden geschaald om compatibiliteit te bieden met oudere toepassingen die oorspronkelijk zijn ontworpen voor kleinere displays.

  3. Het kan verschillen, afhankelijk van de venstermanager waartoe het display behoort.

  • Indien gevraagd van niet-activiteitscontext (b.v. Application Context via (WindowManager)
    getapplicationContext (). Getsystemservice (context.window_service))
    Metrics rapporteert de grootte van het volledige display op basis van de huidige
    rotatie en met afgetrokken systeemdecoratie-gebieden.

  • Indien aangevraagd bij activiteit (het gebruik van getwindowmanager () of (venstermanager) getsystemservice (context.window_service)) als gevolg
    Metrics komen overeen met de huidige metrics van de app-venster. In dit geval kan de grootte kleiner zijn dan fysieke grootte in multi-window-modus.

Dus, om de echte omvang te krijgen:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;

of:

Point point = new Point();
getWindowManager().getDefaultDisplay().getRealSize(point);
int height = point.y;
int width = point.x;

Antwoord 28

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
  public static double getHeight() {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    display.getRealMetrics(displayMetrics);
    //int height = displayMetrics.heightPixels;
    //int width = displayMetrics.widthPixels;
    return displayMetrics.heightPixels;
  }

Met behulp van die methode kunt u schermhoogte krijgen.
Als u de breedte wilt wijzigen displayMetrics.heightPixelsnaar displayMetrics.widthPixels.

En het omvatten ook de vereiste API-build-versie.


Antwoord 29

Ik heb antwoord bijgewerkt voor Kotlin-taal!

Voor KOTLIN: u moet vensterbeheer bellen en metrics krijgen. Na die eenvoudige manier.

val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
var width = displayMetrics.widthPixels
var height = displayMetrics.heightPixels

Hoe kunnen we het effectief gebruiken op een onafhankelijke activiteitsmanier met Kotlin-taal?

Hier heb ik een methode gemaakt in de algemene Kotlin-klasse. Je kunt het bij alle activiteiten gebruiken.

private val T_GET_SCREEN_WIDTH:String = "screen_width"
private val T_GET_SCREEN_HEIGHT:String = "screen_height"
private fun getDeviceSizes(activity:Activity, whichSize:String):Int{
    val displayMetrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(displayMetrics)
    return when (whichSize){
        T_GET_SCREEN_WIDTH -> displayMetrics.widthPixels
        T_GET_SCREEN_HEIGHT -> displayMetrics.heightPixels
        else -> 0 // Error
    }
}

Antwoord 30

Het lijkt erop dat al deze antwoorden mislukken voor mijn Galaxy M51 met Android 11. Na wat rondzoeken vond ik deze code:

WindowMetrics windowmetrics = MainActivity.getWindowManager().getCurrentWindowMetrics();
Rect rect = windowmetrics.getBounds();
int width = rect.right;
int height =rect.bottom;

toont mijn echte apparaatresolutie van 1080×2400, de rest retourneert alleen 810×1800.

Other episodes