NestedScrollView调用requestRectangleOnScreen无法将目标View滚动至中心
问题原因说明
- 你之前使用的
requestRectangleOnScreen仅能保证目标View出现在可视区域,不会主动调整位置到屏幕中心,若View已处于部分可见状态就不会触发滚动 - 直接使用
view.top作为滚动坐标是错误的:该值仅代表目标View相对于其直接父容器(你层级中的LinearLayout)的顶部距离,而非相对于NestedScrollView的坐标,嵌套层级下坐标偏差极大,自然无法滚动到正确位置
解决方案
给NestedScrollView添加扩展方法,通过坐标转换计算正确的滚动位置,不受嵌套层级影响:
import android.graphics.Rect import androidx.core.widget.NestedScrollView fun NestedScrollView.smoothScrollToViewCenter(targetView: View) { // 获取目标View的点击矩形区域 val targetRect = Rect() targetView.getHitRect(targetRect) // 自动转换为相对于当前ScrollView的坐标,自动适配嵌套层级 offsetDescendantRectToMyCoords(targetView, targetRect) // 计算垂直居中需要的滚动偏移量 val scrollYOffset = targetRect.top - (height / 2 - targetView.height / 2) // 边界处理,避免滚动超出内容范围出现空白 val maxScrollY = getChildAt(0).height - height val finalScrollY = scrollYOffset.coerceIn(0, maxScrollY) // 执行平滑滚动,不需要平滑效果可以替换为scrollTo(0, finalScrollY) smoothScrollTo(0, finalScrollY) }
调用示例
如果是在接口响应后调用,建议通过post包裹确保View已经完成布局测量,避免获取到的尺寸/坐标不准确:
// yourTargetView 就是你持有的目标View实例 scrollView.post { scrollView.smoothScrollToViewCenter(yourTargetView) }
特殊场景调整
如果需要将View定位到屏幕顶部而非中心,只需要修改滚动偏移量计算逻辑即可:
// 定位到顶部的偏移量计算 val scrollYOffset = targetRect.top
内容的提问来源于stack exchange,提问作者Astrit Veliu
相关产品推荐
相关产品推荐

