Android如何实现软键盘与页面内容同步平滑上滑效果
软键盘与布局内容同步平移实现方案
前置要求
targetSdkVersion≥ 30(Android 11),低版本系统可自动降级为原有adjustResize行为,无需额外处理- 保持当前窗口软输入模式为
adjustResize,无需切换到adjustPan
实现步骤
1. 开启窗口边到边模式
在Activity的onCreate方法中添加以下配置,让应用内容可以延伸到系统手势导航栏、状态栏区域,为软键盘动画提供基础:
// Kotlin 示例 WindowCompat.setDecorFitsSystemWindows(window, false)
// Java 示例 WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
2. 注册软键盘动画回调
给根布局(也就是你提到的垂直方向LinearLayout)添加WindowInsetsAnimation回调,监听软键盘的动画进度,同步调整内容的Y轴偏移:
// Kotlin 示例 val rootLayout = findViewById<LinearLayout>(R.id.root_layout) ViewCompat.setWindowInsetsAnimationCallback(rootLayout, object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP) { var startBottomOffset = 0 var isImeAnimation = false override fun onPrepare(animation: WindowInsetsAnimationCompat) { super.onPrepare(animation) // 判断当前动画是否为软键盘触发 if (animation.typeMask and WindowInsetsCompat.Type.ime() != 0) { isImeAnimation = true // 记录动画开始前根布局的底部偏移 startBottomOffset = rootLayout.paddingBottom } } override fun onProgress( insets: WindowInsetsCompat, runningAnimations: MutableList<WindowInsetsAnimationCompat> ): WindowInsetsCompat { if (!isImeAnimation) return insets // 获取软键盘当前的高度 val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom // 获取导航栏高度,避免重复计算 val navBarHeight = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom val targetPadding = if (imeHeight > navBarHeight) imeHeight else navBarHeight // 同步调整根布局的底部padding,让内容和软键盘同步移动 rootLayout.setPadding( rootLayout.paddingLeft, rootLayout.paddingTop, rootLayout.paddingRight, targetPadding ) return insets } override fun onEnd(animation: WindowInsetsAnimationCompat) { super.onEnd(animation) isImeAnimation = false } })
3. 适配RecyclerView滚动行为
给RecyclerView添加以下配置,确保软键盘弹出时列表内容不会出现跳跃,同时支持滚动到列表顶部:
- 在XML中给RecyclerView设置
android:clipToPadding="false"属性,允许列表内容延伸到padding区域 - 聊天类列表常用的
android:stackFromEnd="true"属性可以正常生效,不需要额外修改
注意事项
- 不要给根布局设置
android:fitsSystemWindows="true"属性,否则会覆盖边到边配置导致动画失效 - 如果界面存在状态栏、导航栏适配需求,可单独给对应控件处理padding,不需要全局设置fitsSystemWindows
- Android 10及以下系统没有软键盘动画API,会自动回退到原有的
adjustResize行为,不会出现兼容性问题
内容的提问来源于stack exchange,提问作者user246392
相关产品推荐
相关产品推荐

