在Android上进行开发,免不了要支持多分辨率屏幕支持,所以就不得不了解一下Android 的多屏幕支持机制。

首先来了解一下相关的术语。


1.Screen size 屏幕实际尺寸,Android的屏幕实际尺寸分为3个通用的尺寸。

2.Aspect ratio 长宽比

3.Resolution 分辨率

4.Density 密度

5.Density-independent pixel 密度无关的像素

介绍:Adnroid1.6或以上SDK,在AndroidManifest.xml中提供新的一个元素<supports-screens>用于支持多屏幕机制。

<supports-screensandroid:largeScreens="true"   //是否支持大屏android:normalScreens="true"  //是否支持中屏android:smallScreens="true"   //是否支持小屏android:anyDensity="true"     //是否支持多种不同密度/>

Android提供3种方式处理屏幕自适应


一.预缩放的资源(基于尺寸和密度去寻找图片)


1.如果找到相应的尺寸和密度,则利用这些图片进行无缩放小时。


2.如果没法找到相应的尺寸,而找到密度,则认为该图片尺寸为 "medium",利用缩放这个图片显示。


3.如果都无法匹配,则使用默认图片进行缩放显示。默认图片默认标配 "medium" (160)。

二.自动缩放的像素尺寸和坐标(密度兼容)


1.如果应用程序不支持不同密度android:anyDensity="false",系统自动缩放图片尺寸和这个图片的坐标。
(代码中体现)
2.对于预缩放的资源,当android:anyDensity="false",也不生效。
3.android:anyDensity="false",只对密度兼容起作用,尺寸兼容没效果

三.兼容模式显示在大屏幕,尺寸(尺寸兼容)


1.对于你在<supports-screens>声明不支持的大屏幕,而这个屏幕尺寸是normal的话,系统使用尺寸为 ("normal")和密度为("medium)显示。

2. 对于你在<supports-screens>声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统同样使用尺寸为 ("normal")和密度为("medium)显示,不过会出现一层黑色的背景。不是居中显示。

密度独立:


系统默认应用支持DIP单位的,三个使用DIP的地方:


1.加载资源时,使用DIP实现预缩放的资源。


2.在Layout使用DIP,系统自动完成缩放。


3.在应用程序中,自动缩放一些绝对像素。

(只有在android:anyDensity="false"生效)即屏幕自适应方式二


4.像素单位都使用DIP,文本单位使用SP

最佳屏幕独立实践:


1.使用wrap_content, fill_parent 和使用dip作为像素单位in XML layout files。


2.避免使用AbsoluteLayout


3.在代码中,不要使用像素数字硬编码,而是要通过dip转换为px。


例子:


你使用手势分析器分析一个scroll手势,假如,你滚动的距离是16px。


1.在一个160dip的屏幕中,你实际移动距离 16px / 160dpi = 1/10th of an inch (or 2.5 mm)


2.在一个240dip的屏幕中,你实际移动距离 16px / 240dpi = 1/15th of an inch (or 1.7 mm)


// The gesture threshold expressed in dip


private static final float GESTURE_THRESHOLD_DIP = 16.0f;


// Convert the dips to pixels


final float scale = getContext().getResources().getDisplayMetrics().density;


mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale);

4.使用密度和/或尺寸特定资源(通过文件夹)

关于预缩放或者自动缩放图片或9格图


1.系统是一定对会资源包下的图片进行合理的缩放。


例如:一张240x240高密度图片,显示在中密度的屏幕上,图片大小自动变为160x160。


2.你在API中不会得到被缩放后的图片尺寸,得到还是你原来图片的尺寸。


3.如果你不想系统自动帮你缩放图片,可以建立一个res/drawable-nodpi文件夹,存放你的图片。


4.也可以通过BitmapFactory.Options 完成系统自动缩放图片或9格图(在画图时)。


5.自动缩放图片比预缩放花费更多CPU,但是用更少内存(RAM or ROM ?)

更多相关文章

  1. Android ListView滑动过程中图片显示重复错乱闪烁问题解决
  2. Android TextView使用HTML处理字体样式、显示图片等
  3. Android处理大图片
  4. 制作 Nine-Patch 图片
  5. Android:设置圆形头像,Android截取圆形图片
  6. (4.1.21.4)Android Handler 异步消息处理机制的妙用 创建强大的图

随机推荐

  1. 活动的四种启动模式
  2. Android使用ViewPager+Fragment实现定制T
  3. Android 经验: 本地 5555 端口会被 adb
  4. android版本更新功能
  5. activity标签总结2
  6. Android Studio打包以及签名
  7. Android ListView几个比较有用的属性
  8. android样式跟主题
  9. JS判断是IOS还是Android,判断是否微信浏览
  10. android api包简要介绍