📱 全面屏适配核心要素
系统级适配
<!-- AndroidManifest.xml 配置 -->
<meta-data
android:name="android.max_aspect"
android:value="2.4" /> <!-- 支持最大宽高比 -->
<meta-data
android:name="notch.config"
android:value="portrait|landscape" /> <!-- 支持刘海屏方向 -->
显示区域适配
Safe Area(安全区域)
// 获取安全区域
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowInsets windowInsets = getWindow().getDecorView().getRootWindowInsets();
DisplayCutout displayCutout = windowInsets.getDisplayCutout();
if (displayCutout != null) {
// 获取刘海/挖孔区域
List<Rect> boundingRects = displayCutout.getBoundingRects();
// 设置边距
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams)
view.getLayoutParams();
params.topMargin = displayCutout.getSafeInsetTop();
}
}
手势导航适配
禁用系统手势
<!-- styles.xml -->
<style name="FullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowFullscreen">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">
shortEdges
</item>
</style>
// 代码中设置
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
);
// 沉浸式状态栏
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
getWindow().setDecorFitsSystemWindows(false);
}
常见屏幕类型适配方案
| 屏幕类型 | 适配要点 | 代码示例 |
|---|---|---|
| 刘海屏 | 避开状态栏区域 | windowInsets.getDisplayCutout() |
| 水滴屏 | 下移 | safeInsetTop 设置边距 |
| 挖孔屏 | 避开摄像头区域 | 判断 boundingRects |
| 曲面屏 | 边缘防误触 | edgeToEdge + 手势区域限制 |
OpenClaw 特定适配
// OpenClaw 手势冲突处理
public class OpenClawGestureHelper {
// 1. 边缘手势区域定义
private static final int EDGE_WIDTH = 30; // dp
// 2. 处理手势冲突
public boolean handleGestureConflict(MotionEvent event) {
float x = event.getX();
float screenWidth = getResources().getDisplayMetrics().widthPixels;
// 左侧边缘区域 - 用于返回手势
if (x < dpToPx(EDGE_WIDTH)) {
// 优先处理OpenClaw手势
return true;
}
// 右侧边缘区域 - 用于多任务
if (x > screenWidth - dpToPx(EDGE_WIDTH)) {
return true;
}
return false;
}
// 3. 自定义手势监听
private GestureDetector gestureDetector = new GestureDetector(context,
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
// 实现自定义滑动手势
return super.onFling(e1, e2, velocityX, velocityY);
}
});
}
兼容性处理
// 多厂商刘海屏适配
public class NotchCompat {
public static boolean hasNotch(Context context) {
// 华为
if (isHuawei()) {
return checkHuaweiNotch(context);
}
// 小米
if (isXiaomi()) {
return checkXiaomiNotch(context);
}
// OPPO
if (isOppo()) {
return checkOppoNotch(context);
}
// VIVO
if (isVivo()) {
return checkVivoNotch(context);
}
// 标准Android P+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
return hasDisplayCutout(context);
}
return false;
}
}
布局适配最佳实践
<!-- 使用ConstraintLayout进行安全区域布局 -->
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 状态栏占位 -->
<View
android:id="@+id/status_bar_space"
android:layout_width="0dp"
android:layout_height="@dimen/status_bar_height"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<!-- 主要内容区 -->
<androidx.core.widget.NestedScrollView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/status_bar_space"
app:layout_constraintBottom_toTopOf="@id/navigation_bar_space"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<!-- 内容 -->
</androidx.core.widget.NestedScrollView>
<!-- 导航栏占位 -->
<View
android:id="@+id/navigation_bar_space"
android:layout_width="0dp"
android:layout_height="@dimen/nav_bar_height"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
测试方案
// 测试不同屏幕
class ScreenAdaptationTest {
@Test
fun testNotchScreen() {
// 模拟刘海屏
val displayMetrics = DisplayMetrics().apply {
widthPixels = 1080
heightPixels = 2340
}
// 测试布局是否正常
val notchHeight = 80 // 刘海高度
// 验证内容是否避开刘海区域
}
@Test
fun testGestureConflict() {
// 测试手势冲突
val edgeEvent = MotionEvent.obtain(
0, 0, MotionEvent.ACTION_DOWN, 10f, 500f, 0
)
// 验证边缘手势是否被正确拦截
}
}
📊 适配检查清单
-
✅ 状态栏适配

- 沉浸式状态栏
- 状态栏文字颜色适配(亮色/暗色主题)
-
✅ 导航栏适配
- 手势导航条透明化
- 防误触区域设置
-
✅ 异形屏适配
- 刘海/水滴/挖孔屏避开
- 圆角屏幕内容裁剪处理
-
✅ 手势冲突解决
- 边缘滑动优先级
- 多手势并行支持
-
✅ 横竖屏适配
- 横屏时安全区域调整
- 自动旋转时布局调整
🚀 快速适配建议
- 使用官方API优先:优先使用Android官方提供的DisplayCutout等API
- 渐进式适配:先保证核心功能,再逐步完善
- 多设备测试:在不同厂商设备上进行真机测试
- 用户可配置:提供设置选项让用户选择是否使用全面屏手势
需要针对特定设备或具体问题进一步优化吗?
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。