16

CardViewその親の中に展開可能なビューがありますis NestedScrollView。アニメーションの展開が終了したときに子へのスムーズなスクロールを作成しようとしています。しかし、解決策は1つしか見つかりませんでした:

 scrollView.requestChildFocus(someView, someView);

このコードは正常に動作しますが、呼び出すrequestChildFocusとすぐにスクロールするので、少しイライラします。子までスムーズにスクロールできますか?

4

8 に答える 8

29

childViewスクロールしたかった には親CardViewがあるので、childView.getTop()に対して相対値を返します。したがって、トップを取得するには、 getにキャストしてを呼び出す必要があります。CardViewScrollViewScrollViewchildView.getParent().getParent()ViewgetTop()

スクロール位置は次のように計算されます

int scrollTo = ((View) childView.getParent().getParent()).getTop() + childView.getTop();
nestedScrollView.smoothScrollTo(0, scrollTo);
于 2015-11-05T08:08:11.620 に答える
1

ソースコードを読んでみてください。

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ビューを画面に表示したい場所です。

于 2015-11-04T13:08:15.680 に答える
1

そのために私のライブラリを使用できますViewPropertyObjectAnimator

mNestedScrollViewがあなたNestedScrollViewであり、スクロールしたいmChildView子であると仮定すると、次のことができます。View

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

が呼び出しの時点でmChildView.getTop()はないことを確認してください。0.animate(...)

編集:

View's私が言ったように、 CALL のときにトップがゼロでないことを確認してください.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();
        }
    }
});
于 2015-11-04T17:25:09.980 に答える