屏幕适配
适配相关术语:
分辨率:eg:480*800,1280*720。表示物理屏幕区域内像素点的总和(切记:跟屏幕适配没有任何关系)因为我们既可以把1280*720的分辨率做到4.0的手机上面。我也可以把1280*720的分辨率做到5.0英寸的手机上面,如果分辨率相同,手机屏幕越小越清晰
px(pix):像素,就是屏幕中最小的一个显示单元。不同设备显示效果相同。
dpi(像素密度):即每英寸屏幕所拥有的像素数,像素密度越大,显示画面细节就越丰富。计算公式:像素密度={(长度像素数^2+宽度像素数^2)}的开方/屏幕尺寸
注:屏幕尺寸单位为英寸 例:分辨率1280*720屏幕宽度为6英寸,计算所得像素密度约等于245,屏幕尺寸指屏幕对角线的长度
dip:device independent pixels,设备独立像素。不同设备有不同的显示效果,这个和设备硬件有关
屏幕适配方式:
图片适配 在我们的android工程目录下有如下drawable/mipmap-*dpi目录,这些目录是用来适配不同分辨率手机的;不同的目录,代表手机不同的像素密度
以下是android系统的适配策略:
android应用在查找图片资源时会根据其分辨率自动从不同的文件目录下查找。如果在低分辨的文件目录下比如drawable-mdpi中没有图片资源,其他目录中都有,当我们将该应用部署到mdpi分辨率的手机上时,那么该应用会查找分辨率较高目录下的资源文件,如果较高分辨率目录下也没有资源则只好找较低目录中的资源了。
尺寸适配:
跟drawable目录类似的,在android工程的res目录下有values目录,这个是默认的目录,同时为了适配不同尺寸手机我们可以创建一个values-1280*720文件夹,同时将dimens.xml文件拷贝到该目录下。
在dimens.xml中定义一个尺寸
<resources> <dimen name="width">160dp</dimen> </resources>
在values-1280*720目录中的dimens.xml中定义同样的尺寸名称,但是使用不同的尺寸
<resources> <dimen name="width">180dp</dimen> </resources>
当我们在布局文件中使用长或宽度单位时,比如下图所示,应该使用@dimen/width来灵活的定义长度
<TextView android:layout_width="@dimen/width"/>
布局适配-(这种适配几乎不常见)
跟values一样,在android工程目录中layout目录也支持类似values目录一样的适配,在layout中我们可以针对不同手机的分辨率制定不同的布局
权重适配
在控件中使用属性android:layout_weight="1"可以起到适配效果,但是该属性的使用有如下规则:只能用再线性控件中,比如linearlayout。
竖直方向上使用权重的控件高度必须为0dp(Google官方推荐用法)水平方向上使用权重的控件宽度必须为0dp(Google官方推荐用法)
代码适配
在java代码中动态计算控件的宽度和高度。注意:计算的宽度和高度,这里涉及到dp和px之间的转化
说明一下dp代表什么意思?
dip:device independent pixels,设备独立像素。不同设备有不同的显示效果,这个和设备硬件有关。指一个抽象意义上的像素,程序用它来定义界面元素。一个与密度无关,在逻辑尺寸上,与一个位于像素密度为160dpi的屏幕上的像素是一致的
要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式:pixels=dips*(density/160)
举个例子,在DPI为240的屏幕上,1个DIP等于1.5个物理像素
代码中相互换算
public static int dip2px(Context context,float dipValues){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(dipValue*scale + 0.5f); } public static int px2dip(Context context,float pxValues){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(pxValue/scale + 0.5f); }
百分比适配
该适配一般对图片进行适配的。比如:在同一张图片,在不同的设备中,按照图片的宽高比例,进行缩放显示
1)获取图片的宽度和高度
2)计算图片的宽度和高度的比例
3)根据图片的比例,计算出图片的在设备中的显示的实际宽度和高度