ScrollView(RecyclerView等)为什么会自动滚动原理分析

本文深入探讨了ScrollView自动滚动到获取焦点子view的原因,分析了onLayout方法和requestChildFocus方法的角色。通过设置android:descendantFocusability="blocksDescendants"或在子view外层包裹focusableInTouchMode=true的view可以阻止自动滚动。同时,文章提到了RecyclerView的类似问题和解决方案。
摘要由CSDN通过智能技术生成

3.那么ScrollView为什么会滑到获取焦点的子view的位置了?

答:通过上面的分析,我们可以看到当Scrollview中包含有焦点的view的时候,最终会执行view树的重绘制,所以会调用view的onLayout方法,我们看下ScrollView的onLayout方法

android.view.ScrollView{
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);

if (mChildToScrollTo != null && isViewDescendantOf(mChildToScrollTo, this)) {
scrollToChild(mChildToScrollTo);
}
mChildToScrollTo = null;

}
}

从第一步我们可以看到,我们在requestChildFocus方法中,是对mChildToScrollTo进行赋值了,所以这个时候,我们会进入到if判断的执行,调用scrollToChild(mChildToScrollTo)方法:

private void scrollToChild(View child) {
child.getDrawingRect(mTempRect);
offsetDescendantRectToMyCoords(child, mTempRect);

int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);

if (scrollDelta != 0) {
scrollBy(0, scrollDelta);
}
}

很明显,当前的方法就是将ScrollView移动到获取制定的view当中,在这里我们可以明白了,为什么ScrollView会自动滑到获取焦点的子view的位置了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值