2015-11-04 2 views
1

У меня есть расширяемые виды внутри CardView thats parent is NestedScrollView. Я пытаюсь создать гладкую прокрутку к дочернему, когда расширение анимации закончилось. Но я нашел только одно решение:Smoothy прокрутить до ребенка в NestedScrollView

scrollView.requestChildFocus(someView, someView); 

Этот код работает нормально, но, когда вызов requestChildFocus прокручивает немедленно, и то, что раздражает меня немного. Можно ли плавно переходить к ребенку?

+0

https://developer.android.com/reference/android/support/v4/widget/NestedScrollView.html#smoothScrollTo(int, INT)? – Budius

+0

@Budius, если я не ошибаюсь, такого метода нет – Near1999

+0

Я передал ссылку на официальную документацию, я уверен, что она существует, поскольку документация автоматически генерируется на основе комментариев к коду. Может быть, вам нужно обновиться до последней версии lib? – Budius

ответ

4

childView, к которому я хотел прокручивать, имеет CardView parrent, так childView.getTop() возвращает значение по отношению к CardView не к ScrollView. Итак, чтобы получить верхний относительно ScrollView, я должен получить childView.getParent().getParent(), затем отбросить его до View и позвонить по телефону getTop().

положение прокрутки вычисляет как

int scrollTo = ((View) childView.getParent().getParent()).getTop() + childView.getTop(); 
nestedScrollView.smoothScrollTo(0, scrollTo); 
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 место и хотите вид будет показан на экране.

+0

не то, что мне нужно – Near1999

+0

Получите позицию CardView и попробуйте прокрутить до места –

+0

Как я могу это получить? – Near1999

0

Для этого вы можете использовать мою библиотеку ViewPropertyObjectAnimator.

Предполагая mNestedScrollView ваш NestedScrollView и mChildView является ребенок View вы хотите прокрутки, вы можете сделать следующее:

ViewPropertyObjectAnimator.animate(mNestedScrollView).scrollY(mChildView.getTop()).start(); 

Просто убедитесь, что mChildView.getTop() не 0 в момент вызова .animate(...).

Edit:

Как я уже сказал: убедитесь, что ваш View's верх ненулевая при ВЫЗОВ .animate(...). Другими словами: звоните .animate(...) только тогда, когда ваш ребенок View уже имеет размеры. Как вы можете это определить? Например, как это:

mChildView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

    @Override 
    public void onGlobalLayout() { 
     int width = mChildView.getWidth(); 
     int height = mChildView.getHeight(); 
     if (width > 0 && height > 0) { 
      if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { 
       mChildView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } else { 
       mChildView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 

      ViewPropertyObjectAnimator.animate(mNestedScrollView) 
        .scrollY(mChildView.getTop()) 
        .start(); 
     } 
    } 
}); 
+0

В верхней части моего ребенка всегда 0, когда анимация заканчивается ((( – Near1999

+0

проверить мои изменения. –

+0

Я не могу проверить этот ответ сейчас (я сделайте это завтра. Могли бы вы сказать мне, если «.scrollY()» пытается помещать myChildView в верхнюю часть экрана или сначала его видимый пиксель? – Near1999

Смежные вопросы