以像素为单位获取屏幕尺寸

Nik*_*lin 1798 layout android screen pixel dimensions

我创建了一些自定义元素,我想以编程方式将它们放置在右上角(n顶部边缘的m像素和右边缘的像素).因此我需要获得屏幕宽度和屏幕高度,然后设置位置:

int px = screenWidth - m;
int py = screenHeight - n;
Run Code Online (Sandbox Code Playgroud)

如何获得screenWidthscreenHeight在主要活动?

Jos*_*ger 3437

如果您想要显示尺寸(以像素为单位),您可以使用getSize:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
Run Code Online (Sandbox Code Playgroud)

如果你不在,Activity你可以Display通过WINDOW_SERVICE以下方式获得默认值:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Run Code Online (Sandbox Code Playgroud)

如果你在一个片段中想要完成它,只需使用Activity.WindowManager(在Xamarin.Android中)或getActivity().getWindowManager()(在java中).

getSize介绍之前(在API级别13中),您可以使用现在不推荐使用的getWidthgetHeight方法:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated
Run Code Online (Sandbox Code Playgroud)

但是,对于您正在描述的用例,布局中的边距/填充似乎更合适.

另一种方法是:DisplayMetrics

描述有关显示的一般信息的结构,例如其大小,密度和字体缩放.要访问DisplayMetrics成员,请初始化如下对象:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Run Code Online (Sandbox Code Playgroud)

我们可以widthPixels用来获取以下信息:

"显示器的绝对宽度,以像素为单位."

例:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);
Run Code Online (Sandbox Code Playgroud)

  • 我不明白你为什么要使用`try/catch`进行这样的检查?为什么不简单地使用`if(android.os.Build.VERSION.SDK_INT> = 13)`而没有任何抛出异常?我认为普通app-flow中的`try/catch`是不好的做法. (245认同)
  • 试试{display.getSize(size); width = size.x; height = size.y; } catch(NoSuchMethodError e){width = display.getWidth(); height = display.getHeight(); } (52认同)
  • getWidth()或getSize()?如果我需要我的应用程序在API <13以及API> 13上运行,我会使用什么? (13认同)
  • 如果您想获得除导航栏和/或通知栏之外的屏幕尺寸,该怎么办? (11认同)
  • @ A-Live然后应用程序也会破坏(但不会崩溃).我们开发人员必须预先检查一个新的操作系统版本,这可能只是隐藏一个问题.也有了这个论点,我可以/应该用try/catch包围每一个代码行,在我看来,这已经是不好的做法了. (2认同)

Bal*_*i.K 364

一种方法是:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();
Run Code Online (Sandbox Code Playgroud)

它已弃用,您应该尝试使用以下代码.前两行代码为您提供DisplayMetrics对象.此对象包含heightPixels,widthPixels等字段.

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

int height = metrics.heightPixels;
int width = metrics.widthPixels;
Run Code Online (Sandbox Code Playgroud)

  • 也存在这种方式:getContext().getResources().getDisplayMetrics().widthPixels (79认同)
  • 请注意,度量(宽度,高度)会根据设备的旋转而变化. (14认同)
  • 度量标准将返回显示的大小,但HoneyComb及以上,您的活动将比系统栏返回的空间少. (8认同)
  • @Guy取决于你的实施.您可以隐藏状态栏:requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); (3认同)

Fra*_*lli 115

它可能无法回答你的问题,但知道(当我提出这个问题时我自己正在寻找它)可能是有用的,如果你需要一个View的维度,但你的代码在布局尚未布局时正在执行(例如在onCreate())你可以设置一个ViewTreeObserver.OnGlobalLayoutListenerwith View.getViewTreeObserver().addOnGlobalLayoutListener()并放置需要视图维度的相关代码.布局布局后将调用侦听器的回调.

  • 快速实施的要点:) https://gist.github.com/doridori/9208247 (2认同)

dig*_*phd 106

(2012年回答,可能已过时)如果你想支持precomb,你需要在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();
}
Run Code Online (Sandbox Code Playgroud)

当然,已弃用的方法最终会从最新的SDK中取出,但我们仍然依赖大多数拥有Android 2.1,2.2和2.3的用户,这就是我们留下的.


Dra*_*vić 66

我尝试了所有可能的"解决方案"并没有成功,我注意到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) {
}
Run Code Online (Sandbox Code Playgroud)

编辑:稍微改进版本(避免在不支持的操作系统版本上触发异常):

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) {
}
Run Code Online (Sandbox Code Playgroud)

  • 这是此处唯一考虑窗口装饰(状态栏/菜单栏)的帖子.对我来说很棒. (9认同)
  • 请注意,此代码是根据GPL v3许可的,这对在生产应用程序中使用有影响. (8认同)
  • 太棒了,但是你应该永远不会有预期的业务逻辑火灾异常.射击异常(即使被抓住)也很糟糕.另外,如果SDK_INT> 13,则需要做的工作量超过需要.相反,您应该在Build.VERSION.SDK_INT上添加一些ifs. (5认同)
  • @Erik B,我同意.我添加了改进的版本.我仍然离开了部分"自SDK 1"以防万一在try/catch中出现问题(我在Android中看到很多不好的东西,特别是当你认为不可能出错时所以我希望保持安全:)) .无论如何,不​​应该有太多的开销,因为这个计算应该只进行一次(例如,值可以保留在一些静态属性中). (3认同)

Zel*_*ion 47

最简单的方法:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 
Run Code Online (Sandbox Code Playgroud)


Swa*_*nar 46

要访问Android设备状态栏的高度,我们更喜欢以编程方式获取它:

示例代码

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

变量result给出像素中的高度.

快速访问

在此输入图像描述

有关高度的更多信息Title bar,Navigation bar以及Content View,请看看在Android设备屏幕尺寸.


Mar*_*Gil 32

首先获取视图(例如findViewById(),然后)然后您可以在视图本身上使用getWidth().

  • 这实际上是文档告诉你如何做到这一点......但如果你不使用视图,那就没有多大意义了.你可能正在使用别的东西,例如mglsurfaceview. (3认同)
  • 这是更好的,因为父视图可能不是显示的大小.但请确保在您查询大小的视图已经布局的位置完成,这通常不在onCreate()中.您可以使用onWindowFocusChanged(boolean hasFocus)中的自定义回调,该回调将在测量完所有视图后调用,以此类推,确保您不会收到您感兴趣的视图的错误尺寸... (2认同)

Jor*_*sys 27

我有两个函数,一个用于发送上下文,另一个用于获取高度和宽度(以像素为单位):

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}
Run Code Online (Sandbox Code Playgroud)

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}
Run Code Online (Sandbox Code Playgroud)


Crb*_*gan 17

对于使用XML动态扩展,有一个名为"android:layout_weight"的属性

以下示例,根据synic在此线程上的响应进行修改,显示占据屏幕75%(重量= .25)的按钮,以及占据屏幕剩余25%(重量= .75)的文本视图.

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)


Pij*_*usn 17

这是我用于任务的代码:

// `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();
}
Run Code Online (Sandbox Code Playgroud)

看起来足够干净但是,请注意弃用.


Dav*_*ini 17

这不是一个更好的解决方案吗?DisplayMetrics提供您需要的一切,并且可以在API 1中使用.

public void getScreenInfo(){
    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

    heightPixels = metrics.heightPixels;
    widthPixels = metrics.widthPixels;
    density = metrics.density;
    densityDpi = metrics.densityDpi;
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用getRealMetrics获取实际显示(包括屏幕装饰,例如状态栏或软件导航栏),但这仅适用于17+.

我错过了什么吗?


pel*_*ide 15

只是添加到Francesco的答案.另一个更贴切的观察者,如果你想在窗口或位置在屏幕上找到位置是 ViewTreeObserver.OnPreDrawListener()

这也可用于查找在onCreate()时间内大部分未知的视图的其他属性,例如滚动位置,缩放位置.


Nag*_*ddy 15

找到屏幕的宽度和高度:

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();
Run Code Online (Sandbox Code Playgroud)

使用此功能,我们可以获得最新及以上的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);
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*raj 14

在Activity中使用以下代码.

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;
Run Code Online (Sandbox Code Playgroud)


Cri*_*vez 14

DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;
Run Code Online (Sandbox Code Playgroud)


Jus*_*tin 11

我发现这就行了.

Rect dim = new Rect();
getWindowVisibleDisplayFrame(dim);
Run Code Online (Sandbox Code Playgroud)

  • 很酷但是这个方法在源代码中是一个可怕的事情:[这个评论](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.5_r1 /android/view/View.java#4079) (5认同)

Sho*_*med 11

public class AndroidScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                                   + dm.widthPixels
                                   + " x "
                                   + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 11

需要说明的是,如果您不在Activity,但在View(或View在您的范围内具有变量类型),则无需使用WINDOW_SERVICE.然后你可以使用至少两种方式.

第一:

DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();
Run Code Online (Sandbox Code Playgroud)

第二:

DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);
Run Code Online (Sandbox Code Playgroud)

我们在这里调用的所有方法都不会被弃用.


sha*_*mar 10

要获取屏幕尺寸,请使用显示矩阵

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

获取高度和宽度(以像素为单位)

int width  =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;
Run Code Online (Sandbox Code Playgroud)


Ren*_*Pet 8

这不是OP的答案,因为他想要实际像素的显示尺寸.我想要"与设备无关的像素"中的维度,并从这里汇总答案/sf/answers/1251600871/和这里/sf/answers/465974211/我出现了有了这个:

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);
    int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5);
Run Code Online (Sandbox Code Playgroud)


pau*_*ler 7

使用DisplayMetrics(API 1)有一种不推荐的方法可以避免try/catch杂乱:

 // 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;
Run Code Online (Sandbox Code Playgroud)


Sim*_*mon 7

我会像这样包装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;
}
Run Code Online (Sandbox Code Playgroud)


Jéw*_*ôm' 7

你可以使用以下方法获得身高:

getResources().getDisplayMetrics().heightPixels;
Run Code Online (Sandbox Code Playgroud)

宽度大小使用

getResources().getDisplayMetrics().widthPixels; 
Run Code Online (Sandbox Code Playgroud)


Ars*_*hah 7

在 Kotlin 中要简单得多。

val displayMetrics = Resources.getSystem().displayMetrics
displayMetrics.heightPixels
displayMetrics.widthPixels
Run Code Online (Sandbox Code Playgroud)


Khe*_*raj 6

科特林

fun getScreenHeight(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.heightPixels
}

fun getScreenWidth(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.widthPixels
}
Run Code Online (Sandbox Code Playgroud)


dug*_*ggu 5

首先加载XML文件,然后编写以下代码:

setContentView(R.layout.main);      
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());
Run Code Online (Sandbox Code Playgroud)

根据屏幕分辨率显示宽度和高度.


Ste*_*ing 5

在活动的 onCreate 中,有时您需要知道布局可用空间的精确尺寸。经过一番思考,我想出了这种方法。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivityForResult(new Intent(this, Measure.class), 1);
        // Return without setting the layout, that will be done in onActivityResult.
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -1);
        // Width is now set to the precise available width, and a layout can now be created.            ...
    }
}

public final class Measure extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       // Create a LinearLayout with a MeasureFrameLayout in it.
        // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
        LinearLayout linearLayout = new LinearLayout(this);
        LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
        measureFrameLayout.setLayoutParams(matchParent);
        linearLayout.addView(measureFrameLayout);
        this.addContentView(linearLayout, matchParent);
        // measureFrameLayout will now request this second activity to finish, sending back the width.
    }

    class MeasureFrameLayout extends FrameLayout {
        boolean finished = false;
        public MeasureFrameLayout(Context context) {
            super(context);
        }

        @SuppressLint("DrawAllocation")
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if (finished) {
                return;
            }
            finished = true;
            // Send the width back as the result.
            Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
            Measure.this.setResult(Activity.RESULT_OK, data);
            // Tell this activity to finish, so the result is passed back.
            Measure.this.finish();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因您不想向 Android 清单中添加另一个活动,您可以这样做:

public class MainActivity extends Activity {
    static Activity measuringActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            extras = new Bundle();
        }
        int width = extras.getInt("Width", -2);
        if (width == -2) {
            // First time in, just start another copy of this activity.
            extras.putInt("Width", -1);
            startActivityForResult(new Intent(this, MainActivity.class).putExtras(extras), 1);
            // Return without setting the layout, that will be done in onActivityResult.
            return;
        }
        if (width == -1) {
            // Second time in, here is where the measurement takes place.
            // Create a LinearLayout with a MeasureFrameLayout in it.
            // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
            LinearLayout linearLayout = new LinearLayout(measuringActivity = this);
            LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
            measureFrameLayout.setLayoutParams(matchParent);
            linearLayout.addView(measureFrameLayout);
            this.addContentView(linearLayout, matchParent);
            // measureFrameLayout will now request this second activity to finish, sending back the width.
        }
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -3);
        // Width is now set to the precise available width, and a layout can now be created. 
        ...
    }

class MeasureFrameLayout extends FrameLayout {
    boolean finished = false;
    public MeasureFrameLayout(Context context) {
        super(context);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (finished) {
            return;
        }
        finished = true;
        // Send the width back as the result.
        Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
        MainActivity.measuringActivity.setResult(Activity.RESULT_OK, data);
        // Tell the (second) activity to finish.
        MainActivity.measuringActivity.finish();
    }
}    
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您不想要 WindowManagers、Points 或 Displays 的开销,您可以获取 XML 中最顶层 View 项的高度和宽度属性,前提是其高度和宽度设置为 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" >
Run Code Online (Sandbox Code Playgroud)

然后findViewById(R.id.entireLayout).getWidth()将返回屏幕的宽度findViewById(R.id.entireLayout).getHeight()并将返回屏幕的高度。


Fra*_*amo 5

对于谁在没有状态栏操作栏的情况下搜索可用的屏幕尺寸(也感谢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);
}
Run Code Online (Sandbox Code Playgroud)


son*_*ida 5

请遵循以下方法:

public static int getWidthScreen(Context context) {
    return getDisplayMetrics(context).widthPixels;
}

public static int getHeightScreen(Context context) {
    return getDisplayMetrics(context).heightPixels;
}

private static DisplayMetrics getDisplayMetrics(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics;
}
Run Code Online (Sandbox Code Playgroud)