216

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

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

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

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

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

4

13 回答 13

402

尝试这个

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;

或者

谢谢@Tomáš Hubálek

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
于 2012-08-01T08:19:17.193 回答
122

我偶然发现了 Google 提出的这个问题,后来我发现了一个适用于 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.

请参阅配置类参考

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

于 2014-05-27T23:43:30.697 回答
17

为 Kotlin 简化的 2022 答案:

val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }

或作为单线:

val (height, width) = resources.displayMetrics.run { heightPixels/density to widthPixels/density }
于 2020-02-04T21:45:20.257 回答
10

How about using this instead ?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
于 2014-01-27T21:14:21.273 回答
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

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

于 2011-06-24T09:18:55.557 回答
7
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;
于 2017-07-22T18:27:23.400 回答
5

用科特林回答:

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }
于 2019-08-01T13:48:15.647 回答
3

根据 DP 获取屏幕宽度和高度,并进行一些很好的修饰:

第一步:创建接口

public interface ScreenInterface {

   float getWidth();

   float getHeight();

}

第二步:创建实现类

public class Screen implements ScreenInterface {
    private Activity activity;

    public Screen(Activity activity) {
        this.activity = activity;
    }

    private DisplayMetrics getScreenDimension(Activity activity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics;
    }

    private float getScreenDensity(Activity activity) {
        return activity.getResources().getDisplayMetrics().density;
    }

    @Override
    public float getWidth() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.widthPixels / getScreenDensity(activity);
    }

    @Override
    public float getHeight() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.heightPixels / getScreenDensity(activity);
    }
} 

第 3 步:在活动中获取宽度和高度:

Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();
于 2019-01-10T11:05:09.257 回答
1

这是基于先前响应使用的复制/粘贴功能。

  /**
     * @param context
     * @return the Screen height in DP
     */
    public static float getHeightDp(Context context) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
        return dpHeight;
    }

    /**
     * @param context
     * @return the screnn width in dp
     */
    public static float getWidthDp(Context context) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
        return dpWidth;
    }
于 2021-01-21T08:18:04.200 回答
1

在 Compose on a line 的新世界中

val (height, width) = LocalConfiguration.current.run { screenHeightDp.dp to screenWidthDp.dp }
于 2021-11-17T16:29:00.463 回答
0

如果您只是想了解您的屏幕宽度,您可以在开发者选项中搜索“最小屏幕宽度”。你甚至可以编辑它。

于 2019-04-30T06:16:50.243 回答
0

尝试这个:

Display display   = getWindowManager().getDefaultDisplay();
Point displaySize = new Point();
display.getSize(displaySize);
int width  = displaySize.x;
int height = displaySize.y;
于 2020-05-17T07:36:32.763 回答
-5

您的问题是将浮点数转换为 int,从而失去精度。您还应该乘以因子而不是除以。

做这个:

int dp = (int)(pixel*getResources().getDisplayMetrics().density);
于 2011-10-13T10:36:06.487 回答