您的位置:首页 > 移动开发 > Android开发

Android 屏幕适配

2015-07-06 12:45 417 查看
屏幕分辨率的相关概念:

分辨率:整个屏幕的像素数目,屏幕像素宽度*屏幕像素高度,例如:1280*720

density屏幕密度:单位面积内的像素个数,通常是dpi为单位,每英寸的像素数量,android将实际的屏幕密度分为四个通用尺寸(low,medium,high,and extra high)

px:长度单位,屏幕实际像素

dp/dip:长度单位,与具体的密度无关,显示的时候根据具体平台屏幕密度的不同最终转换为相应的像素长度。

dpi:每英寸的像素数量(每英寸等于2.54厘米)

屏幕尺寸:屏幕对角线长度

其中w1280dp表示屏幕宽度为1280dp,h752dp表示屏幕高度为752dp,160dpi表示屏幕密度

values-v11代表在API 11+的设备上(其中API 11+代表android 3.0+),用该目录下的styles.xml代替res/values/styles.xml

values-v14代表在API 14+的设备上(其中API 14+代表android 4.0+),用该目录下的styles.xml代替res/values/styles.xml

换算公式:1dp = (目标屏幕密度/标准密度)*px,标准密度为160dpi

例子:某平台屏幕宽,高分别为1920px,720px,屏幕密度为240dpi。

计算出:宽1280dp和高480dp

1厘米=0.3937 英寸 1英寸=2.54 厘米 像素不能直接换算成英寸、厘米,要在dpi下才能换算!

NOTE:所有的机型宽都是相等的dip数,高不一定是相等的dip数。

240x320 density=120 320dipx426.6dip

320x480 density=160 320dipx480dip

480x800 density=240 320dipx533.3dip

480x854 density=240 320dipx569.33dip



代码中动态地设置某个值:(案例:地图的pin和地图的地址提示框的相对偏移量在不同密度的手机上是不同的)

方法一:求出屏幕密度对比设置偏移量

DisplayMetrics metric = newDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
//实际密度和常见密度对比
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
然后可以在代码中为(120、160、240、320、480等)这几种密度分别设置偏移量。

方法二:在xml文件中对不同密度的手机进行分别设置

可以在values-xxhpdi,values-xhpdi,values-hpdi,values-mdpi,values-ldpi三种文件夹中的dimens.xml文件进行设置

NOTE:
<dimen name="common_bottomoffset">-14dp</dimen> 负数是完全起作用的
NOTE:官方推荐使用尺寸来表示资源layout-large,不推荐使用分辨率layout-1024*600

建议大家多看文档,官方说明:

xlarge screens are at least 960dp x 720dp

large screens are at least 640dp x 480dp

normal screens are at least 470dp x 320dp

small screens are at least 426dp x 320dp



NOTE:Google将设备分为small(2~3英寸)、normal(4英寸左右)、large(5~7英寸)、xlarge(7英寸以上)。(案例:假设你手上的两个设备,设备A是4英寸,设备B是10英寸。在设备A上方放了一个tab控件,有三个页签。放到设备B上看时tab控件的三个页签被拉得很长,本来放6个页签的空间只放了三个页签)我们可以在layout-normal里配置3个页签的tab栏,在layout-xlarge里配置6个页签的tab栏,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。如果应用在所有设备上布局都一样,那么就不用考虑针对不同尺寸的layout。

横竖屏目录区分:

a) drawable-hdpi该图片即适用于横屏,也适用于竖屏;

b) drawable-land-hdpi,当屏幕为横屏,且为高密度时,加载此文件夹的资源;

c) drawable-port-hdpi,当屏幕为竖屏,且为高密度时,加载此文件夹中的资源。其他同理。

d)在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。

不同分辨率横竖屏自动切换布局:(例:800x600)可以在res目录下建立layout-port-800x600和layout-land-800x600两个目录。

不让手机横竖屏切换的方法:在AndroidManifest.xml中的Activity配置里面加入一行android:screenOrientation="landscape"(landscape是横向,portrait是纵向)。

适配某种屏幕:(例800x480)

1.首先是建立多个layout文件夹(drawable也一样)。

在res目录下建立多个layout文件夹,文件夹名称为layout-800x480等。

注意:

a.较大的数字要写在前面:比如layout-854x480而不能写layout-480x854.

b.两个数字之前是小写字母x,而不是乘号。

2.最后需要在AndroidManifest.xml里面配置

在</application>标签和</manifest>标签之间添加
<supports-screens
android:smallScreens="true"是否支持小屏幕
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />


屏幕适配中的界面布局和图片资源:

1)界面布局方面

需要根据物理尺寸的大小准备5套布局,layout(放一些通用布局xml文件,比如界面中顶部和底部的布局,不会随着屏幕大小变化,类似windos窗口的title bar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-large(4英寸-7英寸之间),layout-xlarge(7-10英寸之间)

2)图片资源方面

需要根据dpi值准备6套图片资源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi 3:4:6:8:12



a.图片放在drawable中,等同于放在drawable-mdpi中,原因为:drawable目录不具有屏幕密度特性,所以采用基准值,即mdpi

b.图片放在某个特定drawable中,比如drawable-hdpi,如果设备的屏幕密度高于当前drawable目录所代表的密度,则图片会被放大,否则会被缩小。放大或缩小比例 = 设备屏幕密度 / drawable目录所代表的屏幕密度

c.为了更全面的适配所有设备,我们应该提供一套针对主流屏幕密度的图片(目前为hdpi或xhdpi),其他密度通过系统自动缩放得到图片。

d.自适应原则:图片缩放自适应,位置用相对位置(单位也用dip)。



NOTE:使用点9图片:“上、左”定义可拉伸区域,“右、下”定义显示区域,如果用到完整填充的背景图,建议不要通过android:padding来设置边距,而是通过9-patch方式来定义。Android SDK中提供了编辑9-Patch图片的工具,在tools目录下draw9patch.bat,能够立刻看到编辑后的拉伸效果,也可以直接用其他图片编辑工具编辑,但是看不到效果。





Dp和Px之间的转换:

public class DensityUtil {

/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
手机尺寸分布情况:http://developer.android.com/resources/dashboard/screens.html

接下来将会通过代码屏幕适配,步骤:

1.先创建一个view信息的javabean类: 存储View信息的JavaBean类

2.创建一个计算方法: 分辨率统配类

3.写一个接口

4.代码控制

将在后面的博客中写,感谢大家的关注。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: