我在CardView
内有可扩展的视图,其父级为NestedScrollView
。当扩展动画结束时,我正在尝试为子项创建平滑滚动。但我发现只有一个解决方案:
scrollView.requestChildFocus(someView, someView);
此代码工作正常,但是,当调用requestChildFocus
时,它会立即滚动,这会让我烦恼一点。是否可以顺利滚动到孩子?
答案 0 :(得分:10)
我想要滚动的childView
有CardView
个,childView.getTop()
会返回相对于CardView
而不是ScrollView
的值。因此,为了获得ScrollView
的最高点,我应该childView.getParent().getParent()
然后将其转换为View
并致电getTop()
。
滚动位置计算如
int scrollTo = ((View) childView.getParent().getParent()).getTop() + childView.getTop();
nestedScrollView.smoothScrollTo(0, scrollTo);
答案 1 :(得分:2)
更多@ jerry-sha的答案
fun NestedScrollView.smoothScrollTo(view: View) {
var distance = view.top
var viewParent = view.parent
//traverses 10 times
for (i in 0..9) {
if ((viewParent as View) === this) break
distance += (viewParent as View).top
viewParent = viewParent.getParent()
}
smoothScrollTo(0, distance)
}
答案 2 :(得分:1)
您可以使用我的库ViewPropertyObjectAnimator
。
假设/*global angular:true */
是您的mNestedScrollView
而NestedScrollView
是您要滚动到的子mChildView
,则可以执行以下操作:
View
在致电ViewPropertyObjectAnimator.animate(mNestedScrollView).scrollY(mChildView.getTop()).start();
时,请确保mChildView.getTop()
不是0
。
编辑:
正如我所说:当CALL .animate(...)
时,请确保您的View's
顶部不为零。换句话说:只有当您的孩子.animate(...)
已经拥有维度时,才请致电.animate(...)
。你怎么能确定?例如:
View
答案 3 :(得分:0)
尝试阅读源代码。
svMain.setSmoothScrollingEnabled(true);
Rect rect = new Rect();
rect.top = 0;
rect.left = 0;
rect.right = tv4.getWidth();
rect.bottom =tv4.getHeight();
svMain.requestChildRectangleOnScreen(tv4,rect,false);
rect
是您希望视图显示在屏幕上的位置。
答案 4 :(得分:0)
这应该完成工作,其中childView是要滚动到的视图
public static void scrollToView(final NestedScrollView nestedScrollView, final View viewToScrollTo) {
final int[] xYPos = new int[2];
viewToScrollTo.getLocationOnScreen(xYPos);
final int[] scrollxYPos = new int[2];
nestedScrollView.getLocationOnScreen(scrollxYPos);
int yPosition = xYPos[1];
if (yPosition < 0) {
yPosition = 0;
}
nestedScrollView.scrollTo(0, scrollxYPos[1] - yPosition);
}
答案 5 :(得分:0)
我的子视图与滚动视图的层次不同,因此使该功能基于公认的答案来计算距离和滚动
private int findDistanceToScroll(View view){
int distance = view.getTop();
ViewParent viewParent = view.getParent();
//traverses 10 times
for(int i = 0; i < 10; i++) {
if (((View) viewParent).getId() == R.id.journal_scrollview) {
return distance;
}
distance += ((View) viewParent).getTop();
viewParent = viewParent.getParent();
}
Timber.w("scrollview not found");
return 0;
}
然后使用
滚动journal_scrollview.smoothScrollTo(0, distance);
答案 6 :(得分:0)
主要问题是要计算嵌套滚动视图的正确x / y位置相对。但是,这里的大多数答案都试图通过在层次结构中导航并对所需视图的层次结构层进行硬编码来提出解决方案。恕我直言,如果您更改视图组层次结构,这很容易出错。
因此,我建议使用much more cleaner approach,它基于Rect
计算相对位置。然后,您可以使用nestedscrollview的smoothScrollTo(..)方法滚动到所需位置。