首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android分辨率有关问题

2012-08-09 
android分辨率问题andorid界面单位开发是应该是dip。不要出现决定坐标,和绝对的值。自适应,包括元素大小自适

android分辨率问题

andorid界面单位开发是应该是dip。不要出现决定坐标,和绝对的值。

自适应,包括元素大小自适应,和元素位置自适应。

1.关键点在于用dip,或者先判断特定手机的宽和高。总之一句话像素无关。

2.每个平台一套图片,一套尺寸。

元素大小:

dip会自适应。

图片默认会自适应的。

自适应问题。一个公式 px=dip*(density/160);(density/160)在android系统中对应?DisplayMetrics.density在一固定的手机上它是一个常数,0.75,1,1.5。等。有了这个常数用dip做单位在不同手机上就有不同的px了。这就是缩放原理。dip=px/这个常数。

drawable-hdpi、drawable-mdpi、drawable-ldpi中的图片是自动选择的。但是如果对应的文件夹下没有所需的图片它会在其他两个文件夹下寻找,找到了按density缩放。

元素位置坐标:

元素位置坐标,和触屏事件坐标, 用相对坐标。以屏幕的四边为基本相对位置。

?

?

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

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

?

240x320 density=120 320dipx426.6dip

320x480 density=160 320dipx480dip

480x800 density=240 320dipx533.3dip

480x854 density=240 320dipx569.33dip

?

? ? ? ? 我感觉,做手机的屏幕自适应比做web的浏览器兼容更麻烦..以下是搜到的资料,原来android还有这些不为人知的东西:
一:不同的layout
Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢??
? ?其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。
二:hdpi、mdpi、ldpi
在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。
  drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:
  (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
  (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
  (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
  系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
  在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

?

?

?

android分辨率有关问题android分辨率有关问题

?

android分辨率有关问题

?

?

),DPI=933/3.7=252

?????????????????????????



? ?? ? 这里再补充一下: 一旦你定义了<uses-sdk android:minSdkVersion="4" />,就是限制1.5SDK的手机无法安装你的程序;


? ?? ?OK,继续忙了,大家尝试下吧~

?

1.Screen size 屏幕实际尺寸。
Android讲屏幕实际尺寸分为3个通用的尺寸。
???
?? 2.Aspect ratio 长宽比

?? 3.Resolution 分辨率

?? 4.Density 密度

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

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

?

?

一、相关概念

a)???????android支持density的版本
Android从1.6版本开始支持density(对应API Level 4)

b)???????density
density值表示每英寸有多少个显示点,比如240就是每英寸240个点,它是针对设备的属性,它是屏幕物理长宽的扩展,给屏幕设置为低密度显示的内容少,同样的条件下,密度小的屏幕显示同样的按钮看起来大,高密度的看起来小

c)???????分辨率
是整个屏是多少点,比如800x480,它是对于软件来说的显示单位,以px为单位的点

d)???????设置density的效果
不同density下屏幕分辨率信息,以480dip*800dip的WVGA为例
density=120时 屏幕实际分辨率为240px*400px
density=160时 屏幕实际分辨率为320px*533px
density=240时 屏幕实际分辨率为480px*800px

二、相关代码及设置

a)???????AndroidManifest.xml
<supports-screens android:anyDensity="true"/>
<uses-sdk android:minSdkVersion="4"></uses-sdk>

b)???????资源目录名(android 2.0以后)
res/xxx-hdpi????当density为240时,使用此目录下的资源
res/xxx-mdpi????当density为160时,使用此目录下的资源
res/xxx-ldpi????当density为120时,使用此目录下的资源
res/xxx?????不常后缀,为默认设置,同xxx-mdpi
如果硬件相应的desity的目录不存在,系统会利用存在的density自动乘以系数计算出相应的density

c)???????资源单位(layout xml文件中定义大小的单位)

?????????????????????i.??????????????dp=dip=dx???(Density independent pixel)
基于屏幕密度的抽象单位,布局时尽量使用单位dip,少使用px
dip
应用用于定义UI的虚拟单位,用于说明与密度无关的尺寸和位置。
dip点等价于160dpi密度中的一个物理点,密度由平台决定,换算公式如下
pixels = dips * (density / 160)160DPI的密度系数是1
例如?240?dpi的屏幕,1个dip点等于1.5个物理点

??????????????????ii.??????????????px
设置的绝对点数,?如果使用更高density的系统,?控件就会变小

三、设置density
设置系统变量hw.lcd.density,可设置density

四、实现density的关键源码

a)???????BitmapFactory.java

b)???????ComptibilityInfo.java

五、参考

a)???????http://www.cnmsdn.com/html/201005/1275315384ID5529.html

热点排行