Android的px,dpi,dip三者的关系详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DanteStones/article/details/45192911

px,dpi,dip 这三个东西大家都有了解,这3个都是单位,其中前2个单位在很多别的地方都有使用,但是dip这个单位是Android用来解决不同分辨率屏幕适配的一种方案,也就是大家熟知的dp。

px

全拼pixel,我们常说的像素,构成我们屏幕上图像的最小单位

dpi

作为屏幕分辨率单位如果只有px,明显太单薄了,于是有了dpi这个新单位。
dpi一种像素密度,英文全称是 Dots Per Inch 字面上意思也很好理解,就是指每英寸的像素数量,这里Inch是英寸。1英寸 = 2.54cm,我们项目中的res中的 hdpi,xdpi,xhdpi就是用的这个单位。一般情况 ldpi是120,mdpi是160,hdpi是240,xhdpi是320。

dip

由于Android手机各式各样,我们开发时必然会遇到坑爹的屏幕适配问题,这里Android就用了 dip这个单位。dip 全称是Density-independent pixel 翻译过来就是 像素无关密度 他的大小就是一个1个dpi 有160个像素的屏幕大小,他的计算公式也很简单。从他的定义就可以看出来:
dip = 160px/dpi
px = dip*dpi/160

试想现在有2个屏幕,屏幕的大小都是1寸,A屏幕密度为160,B屏幕密度为320。要去显示一个为宽度为80按钮button。如果用px为单位,A屏幕上button占屏幕的一半0.5寸,B屏幕上button占屏幕的四分之一 0.25寸,小了一半。如果用dip 为单位 80dip
A屏幕上的大小是:80*160/160=80px
B屏幕上的大小 : 80*320/160 = 160px
由于B的密度是A的2倍,现在B屏幕上button的大小自动增加了一倍,这样在A和B屏幕上button可以显示相同的大小了。使用dip这个单位也就达到了适配的目的,顺便说一句dip原本是dip,为了和sp这个单位同意,改名成了dp。

获取屏幕分辨率的方法

获取屏幕分辨率有2种方法:

方法一 :

Display mDisplay = getWindowManager().getDefaultDisplay();
    int W = mDisplay.getWidth();
    int H = mDisplay.getHeight();

这里的w,h 就是屏幕的宽高分辨率

方法二 :

DisplayMetrics mDisplayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
    int W = mDisplayMetrics.widthPixels;
    int H = mDisplayMetrics.heightPixels;

同样这里的w,h 就是屏幕的宽高分辨率
既然我们已经学习了dpi当然也要知道怎么去获取也很简单

DisplayMetrics dm = new DisplayMetrics();
    dm = getResources().getDisplayMetrics();
    int dpi = dm.densityDpi;

dpi就是屏幕密度了。下面用一个简单的例子总结

public class MainActivity extends Activity {

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DisplayMetrics dm = new DisplayMetrics();
        dm = getResources().getDisplayMetrics();
        int dpi = dm.densityDpi;
        int widthPx = dm.widthPixels;
        int heightPx = dm.heightPixels;
        Log.d("MainActivity", "dpi : "+dpi);
        Log.d("MainActivity", "widthPx : "+widthPx);
        Log.d("MainActivity", "heightPx : "+heightPx);
        }
    }

屏幕的密度以及像素信息

猜你喜欢

转载自blog.csdn.net/DanteStones/article/details/45192911