How to collapse/expand a view based on scroll direction?

前端 未结 4 1856
一整个雨季
一整个雨季 2020-12-11 04:39

I have a View and a RecyclerView housed in a LinearLayout. What I want to achieve is something like this:

https://material.google.com/patterns/scrolling-techniques.h

4条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-11 04:51

    Try this:- I also want this kind of animation on custom view and i have achieved it this way.

    public class TestActivity extends AppCompatActivity {
        private static final int HIDE_THRESHOLD = 20;
        //this is you custom layout it is any thing.
        LinearLayout customLayout;
        private int scrolledDistance = 0;
        private boolean controlsVisible = true;
        private RecyclerView recyclerView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.your_layout);
    
            recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                }
    
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    scrolledDistance = dy;
                    if (scrolledDistance > HIDE_THRESHOLD && controlsVisible) {
                        hideViews();
                        controlsVisible = false;
                    } else if (scrolledDistance < -HIDE_THRESHOLD && !controlsVisible) {
                        showViews();
                        controlsVisible = true;
                    }
                }
            });
        }
    
        private void hideViews() {
            customLayout.animate().translationY(-customLayout.getHeight()).setInterpolator(new AccelerateInterpolator(2));
        }
    
        private void showViews() {
            customLayout.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2));
        }
    }
    

    Edit - 1 for ScrollView try this listener

    scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
                @Override
                public void onScrollChanged() {
                    if (scrolledDistance > HIDE_THRESHOLD && controlsVisible) {
                        hideViews();
                        controlsVisible = false;
                        scrolledDistance = 0;
                    } else if (scrolledDistance < -HIDE_THRESHOLD && !controlsVisible) {
                        showViews();
                        controlsVisible = true;
                        scrolledDistance = 0;
                    }
                }
            });
    

    Hope it also helps you...

提交回复
热议问题