概述
Android设备屏幕尺寸和分辨率差异巨大(从3.5寸手机到12寸平板),App Inventor 2默认使用像素(px)布局,不做适配会导致在不同设备上布局错乱。
Android屏幕基础概念
屏幕密度
| 密度分类 | DPI | 典型设备 | 比例 |
|---|---|---|---|
| ldpi | 120 | 老旧设备 | 0.75x |
| mdpi | 160 | 老式手机 | 1x |
| hdpi | 240 | 中端手机 | 1.5x |
| xhdpi | 320 | 主流手机 | 2x |
| xxhdpi | 480 | 高端手机 | 3x |
| xxxhdpi | 640 | 旗舰手机 | 4x |
App Inventor的Screen属性
| 属性 | 值 | 说明 |
|---|---|---|
| ScreenOrientation | unspecified/landscape/portrait | 屏幕方向 |
| ActionBar | true/false | 是否显示标题栏 |
| TitleVisible | true/false | 标题是否可见 |
| ShowStatusBar | true/false | 状态栏 |
| Sizing | Responsive/Fixed | 关键属性 |
方案一:使用Responsive布局(推荐)
设置方法
在Designer中设置Screen1的 Sizing 属性为 Responsive。
Responsive模式下,组件的宽高百分比基于屏幕实际尺寸,而非固定像素值。
布局技巧
当 Screen1.初始化
' 获取屏幕尺寸
设 屏幕宽度 = Screen1.宽度
设 屏幕高度 = Screen1.高度
' 根据屏幕宽度动态调整
如果 屏幕宽度 < 400
' 小屏幕手机
设 标签_标题.字体大小 = 16
设 按钮_操作.宽度 = 屏幕宽度 - 40
否则 如果 屏幕宽度 < 720
' 中等屏幕
设 标签_标题.字体大小 = 20
设 按钮_操作.宽度 = 屏幕宽度 * 0.8
否则
' 大屏幕/平板
设 标签_标题.字体大小 = 24
设 按钮_操作.宽度 = 屏幕宽度 * 0.6
关键原则
- 使用百分比而非固定像素
- ✅
Width = 80%(占屏幕80%) - ❌
Width = 300px(在不同设备上大小不一)
- ✅
- 使用布局容器
- HorizontalArrangement(水平排列)
- VerticalArrangement(垂直排列)
- TableArrangement(表格布局)
- Fill Parent
- 宽/高设为
Fill Parent,组件自动填满父容器
- 宽/高设为
方案二:使用布局容器
垂直滚动布局
结构:
VerticalScrollArrangement(填满屏幕)
├── 标题标签(宽度:Fill Parent)
├── HorizontalArrangement(宽度:Fill Parent)
│ ├── 按钮1(宽度:50%)
│ └── 按钮2(宽度:50%)
├── 图片(宽度:Fill Parent,高度:自适应)
└── 长文本标签(宽度:Fill Parent)
等分布局
当 Screen1.初始化
设 按钮宽度 = Screen1.宽度 / 3
设 按钮1.宽度 = 按钮宽度
设 按钮2.宽度 = 按钮宽度
设 按钮3.宽度 = 按钮宽度
Grid布局(表格)
使用TableArrangement实现网格布局:
TableArrangement
Columns: 2
Rows: 3
├── (1,1) 图片1
├── (1,2) 图片2
├── (2,1) 图片3
├── (2,2) 图片4
├── (3,1) 图片5
└── (3,2) 图片6
方案三:动态尺寸计算
获取设备信息
当 Screen1.初始化
设 屏幕宽 = Screen1.宽度
设 屏幕高 = Screen1.高度
设 密度 = Screen1.密度 ' 屏幕密度系数
设 是平板 = 屏幕宽 > 720
标签_设备信息.文本 = "屏幕:" & 屏幕宽 & "x" & 屏幕高 & " 密度:" & 密度
动态字体大小
定义 自适应字号(基础字号) 返回 实际字号
设 密度 = Screen1.密度
如果 密度 ≤ 1
返回 基础字号
否则 如果 密度 ≤ 1.5
返回 基础字号 * 0.9
否则 如果 密度 ≤ 2
返回 基础字号
否则 如果 密度 ≤ 3
返回 基础字号 * 1.1
否则
返回 基础字号 * 1.2
动态间距
定义 自适应边距() 返回 边距
设 屏幕宽 = Screen1.宽度
如果 屏幕宽 < 400
返回 8
否则 如果 屏幕宽 < 720
返回 16
否则
返回 24
方案四:多布局方案
为不同屏幕尺寸准备不同布局:
当 Screen1.初始化
设 屏幕宽 = Screen1.宽度
如果 屏幕宽 < 480
' 小屏幕:隐藏次要信息,简化布局
设 图片_广告.可见 = false
设 标签_副标题.可见 = false
设 标签_标题.字体大小 = 18
设 按钮行.水平对齐 = 居中
否则 如果 屏幕宽 < 720
' 中屏幕:正常显示
设 图片_广告.可见 = true
设 标签_副标题.可见 = true
设 标签_标题.字体大小 = 22
否则
' 大屏幕/平板:增加间距,加大字号
设 图片_广告.可见 = true
设 标签_副标题.可见 = true
设 标签_标题.字体大小 = 28
设 水平布局1.宽度 = 屏幕宽 * 0.7 ' 限制最大宽度
实战技巧
1. 使用 ScrollView处理长内容
对于内容可能超出屏幕的页面,使用 VerticalScrollArrangement 或 allow_scrolling 方案:
Designer → 拖入 VerticalScrollArrangement → 填满屏幕 → 内部放组件
2. 图片自适应
- Image组件设置
ScalePictureToFit = true - 使用百分比宽高
- 或动态设置图片尺寸
3. 横竖屏适配
当 Screen1.屏幕方向改变()
设 新宽度 = Screen1.宽度
设 新高度 = Screen1.高度
如果 新宽度 > 新高度
' 横屏布局
设 垂直布局.方向 = 水平
否则
' 竖屏布局
设 垂直布局.方向 = 垂直
4. 参考OctoStudio的实时测试
OctoStudio 是MIT开发的手机端App Inventor,支持实时预览。可以参考其做法:
- 使用WebRTC实现手机和电脑实时同步
- 通过USB/WiFi连接测试
- App Inventor的Companion App本身也支持实时测试
常见问题
Q1: 模拟器和真机显示差异大?
模拟器分辨率固定,建议用不同尺寸的真机测试。使用Companion App实时调试:
- 手机和电脑连同一WiFi
- 扫描二维码连接
- 实时修改实时预览
Q2: 固定像素在不同设备上大小不同?
这是因为屏幕密度不同。100px在高密度屏幕上看起来比低密度屏幕小。使用Responsive模式+百分比布局解决。
Q3: 绝对布局中的标签在雷电模拟器中无法显示?
雷电模拟器可能使用特殊的分辨率和密度。避免使用绝对坐标布局,改用相对布局容器。
总结
| 适配方案 | 难度 | 效果 | 推荐 |
|---|---|---|---|
| Responsive模式 | ⭐ | ⭐⭐⭐⭐ | ✅ 首选 |
| 布局容器 | ⭐⭐ | ⭐⭐⭐⭐ | ✅ 必用 |
| 动态计算 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 高级场景 |
| 多布局方案 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 最佳体验 |
核心原则:
- 优先使用 Responsive 模式
- 使用百分比和 Fill Parent
- 避免固定像素值
- 用布局容器组织组件
版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。
扫码添加客服咨询