【Android笔记】Android的坐标、尺寸

mac2022-06-30  85

一、单位介绍

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/kinglearnjava/p/4883272.html

最新回复(0)