一、单位介绍
dip:device independent pixels (设备独立像素),与dp相同。不同设备有不同的显示效果。
dp=dip, px = dpi / 160 * dp ,1pt = dpi/72 sp
ppi:pixels per inch,表示每英寸显示屏所拥有的像素(pixel)数目。ppi = √(X²+Y²)/ Z (X:长度像素数;Y:宽度像素数;Z:屏幕尺寸)。
dpi:dots per inch,dot是一个物理的像素点,一个pixel可能由多个dot组成。dpi和ppi经常被混用,但它们的含义并不相同
px:pixels(像素),即屏幕上的点。不同设备显示效果相同。
pt:point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业;
sp:scaled pixels(放大像素),主要用于字体显示best for textsize。查看TextView的源码可知 Android 默认使用 sp 作为字号单位。
density:即dpi / 160
分辨率:表示整个屏是多少个像素点,如小米4是1080 * 1920。
apk的资源包中,
当屏幕dpi=240时,使用hdpi标签的资源
当屏幕dpi=160时,使用mdpi标签的资源
当屏幕dpi=120时,使用ldpi标签的资源。
二、用DisplayMetrics获取设备尺寸
代码片断如下:
方法一:
private static int ScreenW, ScreenH;
DisplayMetrics metrics = new DisplayMetrics(); // 用于存储屏幕尺寸等信息,好比一个篮子,此时是空的
getWindowManager().getDefaultDisplay().getMetrics(metrics); // 把上述信息存入metrics中
ScreenW = metrics.widthPixels; // 读取信息
ScreenH = metrics.heightPixels;
方法二:
private static int ScreenW, ScreenH;
DisplayMetrics metrics = getResources().getDisplayMetrics();
ScreenW = metrics.widthPixels; // 读取信息
ScreenH = metrics.heightPixels;
用此法获取的DisplayMetrics对象包含了很多属性,用小米4测试,将DisplayMetrics对象的所有属性输出:
widthPixels:1080,heightPixels:1920
density:3.0
densityDpi:480
scaledDensity:3.0
xdpi:449.704, ydpi:447.412
根据开头的公式计算得,此手机屏幕宽度为1080 / 3 = 360 dp,高度为1920 / 3 = 640 dp
三、获取组件的位置
// 获取当前组件在手机屏幕上的位置,单位为px
// 必须是2个元素的数组
int[] location = new int[2];
view.getLocationOnScreen(location);
view.getLocationInWindow(location);
网上搜到的资料说上面两个方法的区别在于是否包含通知栏。但是我测试了默认情况下这两者获取的数值完全一样。
可能在区别在于弹出窗口中的组件,现在还没有学到那一块,将来顺便做个测试。
四、获取组件的宽度与高度
image2 = (ImageView) findViewById(R.id.imageview_2);
// 用这种方法获取的是像素px
LayoutParams para = image2.getLayoutParams();
imagePara.setText("ImageView的width:" + para.width + "\n"
+ "ImageView的height:" + para.height);
// 用代码设置组件宽高,xml中如果用其他布局,代码中也应改成相应布局。
image2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
// 或者直接填入像素px值
image2.setLayoutParams(new LinearLayout.LayoutParams(320, 640));
版权声明:本文为博主原创文章,未经博主允许不得转载。