如何在Android中以dp或dip的形式确定屏幕宽度?

Khu*_*boo 186 android density-independent-pixel

我需要使用dip/dp(在java文件中)编写android小部件的布局.在运行时如果我编码,

int pixel=this.getWindowManager().getDefaultDisplay().getWidth();

这将返回屏幕宽度(以像素为单位)(px).为了将其转换为dp,我编码:

int dp =pixel/(int)getResources().getDisplayMetrics().density ;

这似乎没有返回正确的答案.我制作了WVGA800的模拟器,其屏幕分辨率为480×800.当运行模拟器并让代码打印像素和dp的值时,两者都达到了320.该仿真器为240 dpi,其比例因子为0.75.

Dax*_*Dax 363

试试这个

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);

float density  = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth  = outMetrics.widthPixels / density;
Run Code Online (Sandbox Code Playgroud)

要么

谢谢@TomášHubálek

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
Run Code Online (Sandbox Code Playgroud)

  • 为什么有必要调用WindowManager?这段代码怎么样?DisplayMetrics displayMetrics = resources.getDisplayMetrics(); float screenWidthDp = displayMetrics.widthPixels/displayMetrics.density; (89认同)
  • 这对我使用非常高密度的屏幕不起作用.就好像它只占了屏幕的一小部分.这个解决方案对我有用:http://stackoverflow.com/a/18712361/956975 Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(大小); int width = size.x; int height = size.y; (2认同)

ser*_*lee 105

我偶然发现了谷歌的这个问题,后来发现一个简单的解决方案对API> = 13有效.

供将来参考:

Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.
Run Code Online (Sandbox Code Playgroud)

请参阅配置类参考

编辑:如Nick Baicoianu所述,这将返回屏幕的可用宽度/高度(在大多数情况下应该是有趣的).如果您需要实际的显示尺寸,请坚持最佳答案.

  • 使用Configuration的screenWidthDp/screenHeightDp与DisplayMetrics widthPixels/heightPixels之间的一个重要区别是Configuration返回*useful*显示尺寸(减去状态栏等),而DisplayMetrics返回全屏尺寸. (22认同)

The*_*ogi 9

2021 为 Kotlin 简化的答案:

val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }
Run Code Online (Sandbox Code Playgroud)

或作为单线:

val (height, width) = resources.displayMetrics.run { heightPixels/density to widthPixels/density }
Run Code Online (Sandbox Code Playgroud)


Myk*_*dai 7

您缺少默认密度值160.

    2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
    1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
    3 px = 2 dip if dpi == 240(hdpi), 840x480 screen
Run Code Online (Sandbox Code Playgroud)

换句话说,如果你在纵向模式下设计宽度等于160dip的布局,它将是所有ldpi/mdpi/hdpi设备屏幕的一半(我认为除了平板电脑)


and*_*per 6

如何使用它呢?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
Run Code Online (Sandbox Code Playgroud)


Sup*_*nka 6

DisplayMetrics displayMetrics = new DisplayMetrics();

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

int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;

int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;

int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;


int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;
Run Code Online (Sandbox Code Playgroud)

  • 考虑给出一些解释 (8认同)

Bol*_*ing 5

在 kotlin 中回答:

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }
Run Code Online (Sandbox Code Playgroud)