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

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

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

我如何在主Activity中获取screenWidthscreenHeight

简单的function与较低版本兼容。

 /** * @return screen size int[width, height] * * */ public int[] getScreenSize(){ Point size = new Point(); WindowManager w = getWindowManager(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){ w.getDefaultDisplay().getSize(size); return new int[]{size.x, size.y}; }else{ Display d = w.getDefaultDisplay(); //noinspection deprecation return new int[]{d.getWidth(), d.getHeight()}; } } 

使用:

 int width = getScreenSize()[0]; int height = getScreenSize()[1]; 

如果Display类不起作用,以上答案将不起作用,那么您可以通过下面的方法获取宽度和高度。

 private static final int WIDTH_INDEX = 0; private static final int HEIGHT_INDEX = 1; public static int[] getScreenSize(Context context) { int[] widthHeight = new int[2]; widthHeight[WIDTH_INDEX] = 0; widthHeight[HEIGHT_INDEX] = 0; try { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = windowManager.getDefaultDisplay(); Point size = new Point(); display.getSize(size); widthHeight[WIDTH_INDEX] = size.x; widthHeight[HEIGHT_INDEX] = size.y; if (!isScreenSizeRetrieved(widthHeight)) { DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); widthHeight[0] = metrics.widthPixels; widthHeight[1] = metrics.heightPixels; } // Last defense. Use deprecated API that was introduced in lower than API 13 if (!isScreenSizeRetrieved(widthHeight)) { widthHeight[0] = display.getWidth(); // deprecated widthHeight[1] = display.getHeight(); // deprecated } } catch (Exception e) { e.printStackTrace(); } return widthHeight; } private static boolean isScreenSizeRetrieved(int[] widthHeight) { return widthHeight[WIDTH_INDEX] != 0 && widthHeight[HEIGHT_INDEX] != 0; } 

在Kotlin实现中,以上是一些简单的适应。 它需要上面提到的windowsSoftInput =“adjustResize”在清单中:

 class KeyboardWatcher(private val layoutRooView: View) { companion object { private const val MIN_KEYBOARD_HEIGHT = 200f } private val displayMetrics: DisplayMetrics = layoutRooView.resources.displayMetrics private var stateVisible = false var observer: ((Boolean) -> Unit)? = null init { layoutRooView.viewTreeObserver.addOnGlobalLayoutListener { val heightDiff = layoutRooView.rootView.height - layoutRooView.height if (!stateVisible && heightDiff > dpToPx(MIN_KEYBOARD_HEIGHT)) { stateVisible = true observer?.invoke(stateVisible) } else if(stateVisible) { stateVisible = false observer?.invoke(stateVisible) } } } private fun dpToPx(valueInDp: Float): Float { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, displayMetrics) } } 

并使用:

 val activityRootView = findViewById(R.id.activityRoot) KeyboardWatcher(activityRootView).observer = { visible -> if (visible) do something here ... } 
 DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels; float fheight = dm.density * dm.heightPixels; 

如果getSize由于您的minSDKVersion而得到错误,而您不想使用已弃用的方法( getWidthgetHeight ),则getMetrics解决方案最初由Balaji.K在2011年发布…并且Nik添加了解释getDisplayMetrics也考虑的注释状态栏大小。

其他一些注释是指乘以比例( 密度 )以获得尺寸的精确浮点值。 在Android v2.2(API 8)和v4.0中测试,效果良好, 没有错误/警告

此function返回以英寸为单位的近似屏幕尺寸。

 public double getScreenSize() { DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int width=dm.widthPixels; int height=dm.heightPixels; int dens=dm.densityDpi; double wi=(double)width/(double)dens; double hi=(double)height/(double)dens; double x = Math.pow(wi,2); double y = Math.pow(hi,2); double screenInches = Math.sqrt(x+y); return screenInches; }