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

一、单位介绍

dipdevice independent pixels  (设备独立像素),与dp相同。不同设备有不同的显示效果。

dp=dip, px = dpi / 160 * dp ,1pt = dpi/72 sp

ppipixels per inch,表示每英寸显示屏所拥有的像素(pixel)数目。ppi = √(X²+Y²)/ Z (X:长度像素数;Y:宽度像素数;Z:屏幕尺寸)。

dpidots per inch,dot是一个物理的像素点,一个pixel可能由多个dot组成。dpi和ppi经常被混用,但它们的含义并不相同

pxpixels(像素),即屏幕上的点。不同设备显示效果相同。

ptpoint,是一个标准的长度单位,1pt=1/72英寸,用于印刷业;

spscaled 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值