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

时间:2011-06-24 09:06:56

标签: 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。

12 个答案:

答案 0 :(得分:346)

试试这个

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;

答案 1 :(得分:98)

我偶然发现了谷歌的这个问题,后来我找到了一个对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.

请参阅Configuration class reference

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

答案 2 :(得分: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设备屏幕的一半(我认为除了平板电脑)

答案 3 :(得分:6)

如何使用它呢?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;

答案 4 :(得分: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;

答案 5 :(得分:6)

简化为Kotlin:

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

答案 6 :(得分:4)

科特林的答案:

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }

答案 7 :(得分:1)

获取具有良好装饰的DP的屏幕宽度和高度:

第1步:创建界面

public interface ScreenInterface {

   float getWidth();

   float getHeight();

}

第2步:创建实施者类

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();

答案 8 :(得分:1)

如果您只想了解屏幕宽度,则可以在开发人员选项中搜索“最小屏幕宽度”。您甚至可以对其进行编辑。

答案 9 :(得分: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;
    }

答案 10 :(得分:0)

尝试一下:

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

答案 11 :(得分:-5)

你的问题是将float转换为int,失去了精度。你也应该乘以因子而不是除以。

这样做:

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