Converting pixels to dpi for mdpi and hdpi screens

2019-09-09 17:22发布

I am using this code that I have found on another thread which is working fine on mdpi screens:

public static float convertDpToPixel(float dp,Context context){
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float px = dp * (metrics.densityDpi/160f);
        return px;
    }

public static float convertPixelsToDp(float px,Context context){
        Resources resources = context.getResources();
        DisplayMetrics metrics = resources.getDisplayMetrics();
        float dp = px / (metrics.densityDpi /160f);
        return dp;

    }

When using it on hdpi screens the text size jumps when trying to increase the text size. I am assuming its because it is using the hardcoded 160f when dividing the densityDpi? Is there any dynamic way to determine whether it is 160dpi or 240dpi?

2条回答
倾城 Initia
2楼-- · 2019-09-09 17:32

From the doc:

metrics.density 

is the scaling factor you are looking for.

This is a scaling factor for the Density Independent Pixel unit, where one DIP is one pixel on an approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), providing the baseline of the system's display. Thus on a 160dpi screen this density value will be 1; on a 120 dpi screen it would be .75; etc.

查看更多
姐就是有狂的资本
3楼-- · 2019-09-09 17:48

Try this method:

public float dpToPx(float dp, Context context) {
    float density = context.getResources().getDisplayMetrics().density;
    return dp * density;
}
查看更多
登录 后发表回答