android屏幕适配

常见的度量单位

> in、px、pt、ppi、dpi、dp、sp



1. in

 (inch) 英寸(手机斜边长度),现实中我们提到4英寸手机或者5.5英寸大屏手机,而这个尺寸是用户真正感受到的物理大小。


2. px 

(pixel) pixel即像素,是屏幕上显示数据的最基本的点。px是就是一张图片中最小的点,一张位图就是由这些点构成的。px是一个点,它不是自然界的长度单位,谁能说出一个“点”有多长多大么?可以画的很小,也可以很大。如果点很小,那画面就清晰,我们称它为“分辨率高”,反之,就是“分辨率低”。所以,“点”的大小是会“变”的,也称为“相对长度”。


3. pt

 (point) point即像点,pt是印刷行业常用单位,等于1/72英寸。pt全称为point,但中文不叫“点”,查金山词霸可以看到,确切的说法是一个专用的印刷单位“磅”,大小为1/72英寸。所以它是一个自然界标准的长度单位,也称为“绝对长度”。因此就有这样的说法,pixel是相对大小,而point是绝对大小。


4. ppi

 (pixels per inch) 图像分辨率 (每英寸上有几个像素)


5. dpi

 (dots per inch) 打印分辨率 (每英寸上有几个像点)


6. dp和dip

Android中,dp是Density-independent Pixels简写,而dip则是Density Independent Pixels,实际上指的是一个概念,都是Android的单位。在文档More Resource Types中有描述。

(density-independent pixels) 以160dpi屏幕为标准,则1dp=1px,dp和px的换算公式:

例1:
dpi = sqrt(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数
iphone5的ppi是多少?dpi=sqrt(1136px² + 640px²)/4 in=326dpi(视网膜Retina屏)


例2:
手机型号:G700
手机分辨率:1280*720 (注:手机两个直角边上分别放置了1280及720个像素)
手机尺寸大小:5英寸(手机斜边长度)

假设a,b分别为两个直角边,c为斜边,由勾股定理可得出计算方式:sqrt(a*a+b*b)/c
计算结果:sqrt(1280*1280+720*720)/5 ≈ 293.72dpi
根据google官方文档说明得出,当前手机最接近320dpi,则将其归纳在xhdpi手机范围内,即1dp=2px;


例3:
手机型号:模拟器
手机分辨率:800*480(注:手机两个直角边上分别放置了800及480个像素)
手机尺寸大小:3.7英寸(手机斜边大小)

假设a,b分别为两个直角边,c为斜边,由勾股定理可得出计算方式:sqrt(a*a+b*b)/c
计算结果:sqrt(800*800+480*480)/3.7 ≈ 252.15dpi
根据google官方文档(图1-1)得出,当前手机接近240dpi,则将其归纳在hdpi手机范围内,即1dp=1.5px。



7. sp

 (Scale-independent pixels) 它是安卓的字体单位,以160dpi屏幕为标准,当字体大小为 100%时, 1sp=1px。

sp 与 px 的换算公式:sp*dpi/160 = px




安卓中使用dp和sp的原因


是不是看起来dp和sp一样,在Android设计原则中,有提到这两个单位,他建议文字的尺寸一律用sp单位,非文字的尺寸一律使用dp单位。

例如:textSize="16sp"、layout_width="60dp"。

为什么要把sp和dp代替px?

最简单的原因是他们不会因为dpi的变化而变化,在相同物理尺寸和不同dpi下,他们呈现的高度大小是相同。也就是说更接近物理呈现,而px则不行。



android代码适配

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;

public class second extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		Constant constant = new Constant();
		String tag = "ziru";

		// 获取封装当前手机屏幕信息对象,用于存放宽高值
		DisplayMetrics metrics = new DisplayMetrics();
		// 给当前屏幕设置宽高
		getWindowManager().getDefaultDisplay().getMetrics(metrics);
		// 获取高度
		constant.srceenHeight = metrics.heightPixels;
		// 获取宽度
		constant.srceenWidth = metrics.widthPixels;

		//计算1dp等于几px? 例如: 1280x720的5英寸手机, 1dp=2px
		float density = this.getResources().getDisplayMetrics().density;

		Log.i(tag, "Constant.srceenHeight = " + constant.srceenHeight);
		Log.i(tag, "Constant.srceenWidth = " + constant.srceenWidth);
		Log.i(tag, "density = " + density);
	}

	public class Constant {
		public int srceenHeight;
		public int srceenWidth;
	}

}



px和sp互转,px和dp互转工具类

import android.content.Context;

public class DisplayUtils {

	/**
	 * px转dp
	 */
	public static int px2dip(Context context, float pxValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (pxValue / scale + 0.5f);
	}

	/**
	 * dp转px
	 */
	public static int dip2px(Context context, float dipValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dipValue * scale + 0.5f);
	}

	/**
	 * px转sp
	 */
	public static int px2sp(Context context, float pxValue) {
		final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
		return (int) (pxValue / fontScale + 0.5f);
	}

	/**
	 * sp转px
	 */
	public static int sp2px(Context context, float spValue) {
		final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
		return (int) (spValue * fontScale + 0.5f);
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值