Android开发中如何获得正确的layout资源(layout-sw480dp layout-sw600dp-land layout-sw720dp-port)

本文介绍了Android应用中平板布局的选择方法及计算公式,并详细解释了px、pt、ppi、dpi、dp和sp等单位的定义与换算关系。
 Android应用里里,大家一定饱受各种layout-sw480dp layout-sw600dp-land layout-sw720dp-port之苦,往往不知道自己的平板加载的是哪个Layout而不得不一个个尝试,网上一大堆说不清的教程。本人查阅很多资料,给大家分享一种计算方法确定自己平板所加载哪个dp的资源。
事实上,sw不是software的,意思,我猜是shortest width,最短的宽度。
sw-xxxx-dp的计算公式是  sw *160/dpi
比如 1280*800, sw 是800
     480*800, sw 是480

如下范例,相信可以更好理解计算方法,其中dpi其实是人为在Android/device/softwinner/astar-common/astar-y3.mk中设定的,
没有Android源码的可以通过 adb shell getprop ro.sf.lcd_density 获得。
  
机型   
       分辨率
sw
   dpi=  ro.sf.lcd_density  
         sw *160/dpi    =            dp
H7(Android5.1)     
1280*720     
720
213     
720*160/213=540.84 =       sw340dp
H7(Android4.4)     
1280*720    
720
160     
720*160/160=720=              sw720dp
A33 astar-y2              
1024*768     
768
160    
768*160/160 =768 =            sw720dp
杂牌                
800*480      
480
120      
480*160/120 =640=             sw600dp
杂牌               
800*480    
480
160    
480*160/160 =480=             sw480dp
通过公式 sw*160/dpi 计算出结果之后,选择一个比这个结果小,而又最接近这个值的dp。
比如,范例中H7(Android 5.1)算出来是540.84,如果你的layout下存在一个 sw480dp,那这里dp肯定是sw480dp,如果没有sw480dp,只能找到sw340dp.
land是横屏,port是竖屏。



QQ20150717160352

做了几个移动端的项目之后,深感移动端尺寸换算的必要性,在此做个总结。

先介绍下各自的定义:

  • px:pixel,像素,电子屏幕上组成一幅图画或照片的最基本单元
  • pt: point,点,印刷行业常用单位,等于1/72英寸
  • ppi: pixel per inch,每英寸像素数,该值越高,则屏幕越细腻
  • dpi: dot per inch,每英寸多少点,该值越高,则图片越细腻
  • dp: dip,Density-independent pixel, 是安卓开发用的长度单位,1dp表示在屏幕像素点密度为160ppi时1px长度
  • sp: scale-independent pixel,安卓开发用的字体大小单位。

以下是换算关系:

一、pt和px

公式一: 1pt= (DPI / 72) px

当photoshop中新建画布的分辨率为72ppi( 即 72dpi时 ), 1pt=1px; 当新建画布分辨率为72*2=144ppi时,1pt=2px

二、ppi和dpi

dpi最初用于衡量打印物上每英寸的点数密度。DPI值越小图片越不精细。当DPI的概念用在计算机屏幕上时,就应称之为ppi。同理: PPI就是计算机屏幕上每英寸可以显示的像素点的数量。因此,在电子屏幕显示中提到的ppi和dpi是一样的,可认为

公式二:dpi=ppi

三、ppi计算方法

ppi是指屏幕上的像素密度,其计算方法为:

公式三: ppi= 屏幕对角线上的像素点数/对角线长度 = √ (屏幕横向像素点^2 + 屏幕纵向像素点^2)/对角线长度

以小米2s为例,该屏幕分辨率为720px*1280px,4.3英寸。则点密度为 √ (720^2 +1280^2) /4.3 = 342ppi。

四、px和dp

dp为安卓开发时的长度单位,根据不同的屏幕分辨率,与px有不同的对应关系。

安卓端屏幕大小各不相同,根据其像素密度,分为以下几种规格:

QQ20150717160404

1dp定义为屏幕密度值为160ppi时的1px,即,在mdpi时,1dp = 1px。 以mdpi为标准,这些屏幕的密度值比为:ldpi : mdpi : hdpi : xhdpi : xxhdpi = 0.75 : 1 : 1.5 : 2 : 3;即,在xhdpi的密度下,1dp=2px;在hdpi情况下,1dp=1.5px。其他类推。

公式四: 1dp=(屏幕ppi/ 160)px

以WVGA屏为例,该屏幕为480px*800px,按3.8寸屏算,点密度 √ (480^2 + 800^2) / 3.8 = 245,约等于240,对应于hdpi屏幕,所以该屏幕1dp=1.5px

五、dp和sp

dp和sp都是安卓的开发单位,dp是长度单位,sp是字体单位。sp与dp类似,但是可以根据用户的字体大小首选项进行缩放。Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),

公式五:当文字尺寸是“正常”时1sp=1dp,而当文字尺寸是“大”或“超大”时,1sp>1dp。

一般情况下可认为sp=dp。

总结:由于做设计时以xhdpi为模板,xhdpi条件下,1dp=2px。若新建画布时,将画布分辨率设为144ppi,则1pt=2px=1dp。此时,即可将pt等同于dp。标注长度的时候,将长度像素除以2即为dp值。

PS:在photoshop cc中切图时,可直接在.png 图片图层名称前加上200%获得2倍大小的图,其他比例的切图以此类推。输出的两倍图不模糊的前提是,该图是photoshop中用形状工具画出来的未被栅格化的图形,而不是已被栅格化的图层或外部导入的图片。


<think>我们正在讨论的是Android中的布局适配,特别是关于`layout-sw320dp`文件夹在大屏设备上的适配机制。 根据引用[1][2][3][4]以及之前的讨论,我们知道: - `layout-sw<N>dp`中的`sw`代表smallest width(最小宽度),即屏幕最短边的尺寸(以dp为单位)。 - 系统在加载布局时,会根据设备当前的最小宽度(与屏幕方向无关)来选择最匹配的资源文件夹。 问题:如何理解`layout-sw320dp`文件夹在大屏设备上的适配机制? 解答: 1. **最小宽度(sw)的定义**: 最小宽度是设备屏幕的固定物理特性,它不会随着屏幕方向改变而改变。它等于屏幕原始尺寸(像素)除以屏幕密度(dpi)后得到的dp值,且取宽度和高度的最小值。 公式:$$ \text{最小宽度} = \min\left(\frac{\text{屏幕宽度(px)}}{\text{density}}, \frac{\text{屏幕高度(px)}}{\text{density}}\right) $$ 其中,density = dpi / 160。 2. **适配机制**: - 当设备的最小宽度(sw)大于等于320dp时,系统会使用`layout-sw320dp`文件夹中的布局资源- 注意:系统会选择最接近(且不超过设备最小宽度)的限定符文件夹。例如,如果设备的最小宽度为400dp,且存在以下文件夹: - `layout-sw320dp` - `layout-sw480dp` 那么系统会选择`layout-sw320dp`,因为400dp大于320dp但小于480dp,所以不会选择`layout-sw480dp`(因为设备的最小宽度没有达到480dp)。但是,如果有更接近的限定符,比如`layout-sw400dp`,那么就会选择它。如果没有,则选择不超过设备最小宽度的最大限定符文件夹。 3. **在大屏设备上的表现**: - 大屏设备通常具有较大的最小宽度(例如,平板的最小宽度可能为600dp或更大)。因此,对于最小宽度为600dp的设备: - 如果项目中没有提供`layout-sw600dp`文件夹,但提供了`layout-sw320dp`,系统会回退到`layout-sw320dp`吗? - 答案:不会。因为系统会选择最接近且不超过设备最小宽度的限定符文件夹。但是,如果项目中没有比320dp更大且不超过600dp的限定符文件夹(例如,没有sw480dpsw600dp等),那么系统会选择`layout-sw320dp`吗? - 实际上,系统会选择所有满足条件(即最小宽度限定符小于等于设备最小宽度)的文件夹中,数值最大的那个。因此,如果设备的最小宽度为600dp,而项目中只有`layout-sw320dp`和`layout`(默认)两个文件夹,那么系统会选择`layout-sw320dp`(因为它是在所有满足条件的文件夹中数值最大的,即320dp<600dp,且没有更大的限定符文件夹)。 4. **实际开发中的注意事项**: - 为了确保大屏设备使用更合适的布局,我们应该为不同范围的最小宽度提供不同的布局文件夹。例如: - `layout-sw320dp`:用于手机(最小宽度320dp以上,但小于下一个断点,比如480dp- `layout-sw600dp`:用于7英寸平板(最小宽度600dp以上) - `layout-sw720dp`:用于10英寸平板(最小宽度720dp以上) - 如果大屏设备(如平板)没有对应的`layout-sw600dp`文件夹,而只有`layout-sw320dp`,那么它就会使用为手机设计的布局(即`layout-sw320dp`中的布局),这可能导致布局在大屏幕上拉伸或显示不美观。 5. **引用支持**: 根据引用[3]:如果设备的最小宽度是480dp,而项目中没有`values-sw480dp`,系统会寻找最接近的(且小于等于480dp)的限定符文件夹,比如`values-sw400dp`(如果存在),如果都没有,则使用默认的`values`文件夹。同理,布局文件夹也是如此。 6. **示例**: 假设设备是Nexus 7(最小宽度为600dp),项目中有以下布局文件夹: - `layout`(默认) - `layout-sw320dp` - `layout-sw480dp` - `layout-sw600dp`(没有,但问题中我们假设没有这个文件夹,而只有sw320dp) 那么系统会怎么选择? - 设备最小宽度600dp,满足条件(小于等于600dp)的文件夹有:`layout-sw480dp`(480dp<=600dp),`layout-sw320dp`(320dp<=600dp),以及默认的`layout`。 - 系统会选择其中数值最大的,即`layout-sw480dp`(如果存在)。如果不存在`layout-sw480dp`,那么就会选择`layout-sw320dp`(因为它是剩下的满足条件的文件夹中数值最大的)。如果连`layout-sw320dp`都没有,则使用默认的`layout`。 7. **结论**: `layout-sw320dp`文件夹在大屏设备上的适配机制是:当大屏设备的最小宽度大于等于320dp,且没有其他更大数值的限定符文件夹(且不超过设备最小宽度)时,系统就会使用`layout-sw320dp`中的布局。因此,为了确保大屏设备使用专门为其设计的布局,我们应该为不同的大屏尺寸提供对应的布局文件夹(如`layout-sw600dp`等)。 引用说明: [^1]: Androidlayout-sw600dplayout-w600dplayout-h600dp的区别。 [^2]: 屏幕适配的方法。 [^3]: 系统会寻找最接近的限定符文件夹。 [^4]: 7寸平板使用layout-sw600dp目录。 相关问题: 1. 如何计算Android设备的最小宽度(sw)? 2. 在Android开发中,如何为不同屏幕尺寸提供不同的布局? 3. 最小宽度限定符(sw)和可用宽度限定符(w)有什么区别? 4. 如何避免大屏设备使用小屏设备的布局?</think>### Android中`layout-sw320dp`文件夹在大屏设备上的适配机制 在Android屏幕适配中,`layout-sw320dp`文件夹使用**最小宽度限定符**(smallest width,简称sw)来适配设备。其核心机制如下: #### 1. **最小宽度限定符原理** - **sw定义**:最小宽度是设备屏幕**较短边**的固定物理尺寸(单位:dp),计算公式: $$ \text{最小宽度} = \min\left(\frac{\text{屏幕宽度(px)}}{\text{density}}, \frac{\text{屏幕高度(px)}}{\text{density}}\right) $$ 其中`density = dpi/160`(密度无关比例因子)。 - **适配规则**:系统会加载**设备最小宽度 ≥ 限定值**的最接近资源文件夹。例如: - 设备最小宽度=400dp → 优先匹配`layout-sw400dp`(若存在),否则匹配`layout-sw320dp`(因320dp < 400dp)。 - 设备最小宽度=600dp(如7寸平板) → 优先匹配`layout-sw600dp`,若无则回退到`layout-sw320dp`[^3][^4]。 #### 2. **在大屏设备上的表现** | 设备类型 | 最小宽度范围 | `layout-sw320dp`的适配情况 | |----------------|-------------|-----------------------------------------------| | 小屏手机 | <320dp | ❌ 不匹配(使用默认`layout`或更小限定符) | | 标准手机 | ≥320dp | ✅ 匹配(如360dp手机) | | 7寸平板 | ≥600dp | ⚠️ 回退匹配(若缺少`sw600dp`文件夹) | | 10寸平板 | ≥720dp | ⚠️ 回退匹配(若缺少`sw720dp`文件夹) | **关键点**: - **回退机制**:当大屏设备(如平板)缺少对应的`layout-sw600dp`或`layout-sw720dp`时,系统会**向下匹配**`layout-sw320dp`中的布局[^3][^4]。 - **潜在问题**:手机布局直接拉伸到平板上可能导致UI元素过小或排版错乱。 #### 3. **与其它限定符的区别** | 限定符类型 | 示例 | 适配逻辑 | 适用场景 | |------------------|------------------|---------------------------------------------|-----------------------| | **sw (最小宽度)** | `layout-sw320dp` | 基于**设备固定物理尺寸**(与方向无关) | 通用屏幕尺寸分类 | | **w (可用宽度)** | `layout-w600dp` | 基于**当前可用宽度**(随方向变化) | 横竖屏动态适配[^1] | | **h (可用高度)** | `layout-h600dp` | 基于**当前可用高度**(随方向变化) | 特定高度需求 | | **旧尺寸分类** | `layout-small` | 基于物理英寸(不精确,已淘汰) | 不推荐使用 | #### 4. **最佳实践** 1. **优先使用sw限定符**:为不同尺寸分段创建文件夹: - `layout-sw320dp`:手机 - `layout-sw600dp`:7寸平板 - `layout-sw720dp`:10寸平板 2. **避免回退问题**:为大屏设备显式提供专属布局,防止回退到手机布局。 3. **结合w/h限定符**:在`sw600dp`基础上,用`w/h`进一步优化横竖屏布局: ```markdown res/ ├── layout-sw600dp/ # 7寸平板通用布局 ├── layout-sw600dp-land/ # 7寸平板横屏优化 └── layout-sw600dp-port/ # 7寸平板竖屏优化 ``` 4. **测试验证**:通过Android Studio的**Layout Inspector**检查不同设备上的实际加载资源。 > **示例场景**:Nexus 7平板(最小宽度=600dp) > - 若存在`layout-sw600dp` → 加载该布局 ✅ > - 若不存在 → 回退到`layout-sw320dp`(手机布局) ⚠️ > - 解决方案:显式创建`layout-sw600dp`文件夹[^4]。 #### 5. **为什么需要这种机制?** - **分辨率无关性**:dp单位屏蔽了像素密度差异,确保不同DPI设备一致显示。 - **方向无关性**:sw基于设备物理特性,不随屏幕旋转改变。 - **精准控制**:比旧式`layout-small/large`更精确,避免大屏设备错误匹配小布局[^2][^4]。 [^1]: Androidlayout-sw600dplayout-w600dplayout-h600dp的区别。 [^2]: 屏幕适配的方法。 [^3]: 系统会寻找最接近的限定符文件夹。 [^4]: 7寸平板使用layout-sw600dp目录。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值