Appearance
折叠屏适配
字数统计:约 10000 字
难度等级:⭐⭐⭐⭐
面试重要度:⭐⭐⭐
目录
1. 折叠屏简介
1.1 设备特性
折叠屏特点:
- 双屏幕/可折叠屏幕
- 展开/折叠状态
- 跨屏内容传输
- 特殊手势1.2 适配挑战
挑战:
- 多屏幕尺寸
- 动态布局变化
- 跨屏连续性
- 性能优化2. 检测与适配
2.1 检测折叠状态
kotlin
fun isFoldable(context: Context): Boolean {
return context.packageManager.hasSystemFeature(
PackageManager.FEATURE_HARDWARE_TYPE_FOLDABLE
)
}
fun getFoldState(context: Context): Int {
return when (context.display.foldState) {
Display.FOLD_STATE_OPENED -> FOLD_STATE_OPENED
Display.FOLD_STATE_CLOSED -> FOLD_STATE_CLOSED
else -> FOLD_STATE_UNKNOWN
}
}2.2 监听折叠变化
kotlin
class FoldableActivity : AppCompatActivity() {
private val foldListener = Consumer<Display> { display ->
when (display.foldState) {
FOLD_STATE_OPENED -> {
// 展开 - 使用双栏布局
}
FOLD_STATE_CLOSED -> {
// 折叠 - 使用单栏布局
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
display.addOnFoldChangeListener(foldListener)
}
}3. 响应式布局
3.1 使用 ConstraintLayout
xml
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 小屏幕 -->
<fragment
android:id="@+id/listFragment"
android:name="com.example.ListFragment"
app:layout_constraintWidth_percent="1" />
<!-- 大屏幕 -->
<fragment
android:id="@+id/detailFragment"
android:name="com.example.DetailFragment"
app:layout_constraintWidth_percent="0.5" />
</androidx.constraintlayout.widget.ConstraintLayout>3.2 使用 Compose
kotlin
@Composable
fun ResponsiveLayout() {
val foldState = rememberFoldState()
if (foldState == FOLD_STATE_OPENED) {
Row {
ListPane()
DetailPane()
}
} else {
NavigationHost()
}
}4. 跨屏连续性
4.1 状态保存
kotlin
class ContinuityManager {
fun saveState() {
// 保存当前状态
// 列表位置、选中项
}
fun restoreState() {
// 恢复状态
}
}4.2 内容传输
kotlin
// 使用 SharedElement
override fun onDestroyView() {
super.onDestroyView()
// 传输内容到另一屏幕
}5. 面试考点
Q1: 折叠屏适配要点?
- 检测折叠状态
- 响应式布局
- 跨屏连续性
Q2: 如何实现响应式?
- ConstraintLayout
- Compose
- 备用布局
本文完