在NestedScrollView中平滑滚动到Child

时间:2015-11-04 12:58:03

标签: android nestedscrollview

我在CardView内有可扩展的视图,其父级为NestedScrollView。当扩展动画结束时,我正在尝试为子项创建平滑滚动。但我发现只有一个解决方案:

 scrollView.requestChildFocus(someView, someView);

此代码工作正常,但是,当调用requestChildFocus时,它会立即滚动,这会让我烦恼一点。是否可以顺利滚动到孩子?

7 个答案:

答案 0 :(得分:10)

我想要滚动的childViewCardView个,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 */ 是您的mNestedScrollViewNestedScrollView是您要滚动到的子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(..)方法滚动到所需位置。