Android

[Android] ScrollView 자동 스크롤과 사용자 스크롤

HAINIX_X 2020. 6. 2. 15:01
반응형

안드로이드 개발을 하다보면 스크롤 뷰를 쓸 일이 되게 많다. 최근에는 엔딩크레딧을 개발하게 됐는데 사용자가 스크롤도 하면서 자동으로 밑으로 스크롤이 되어야 하는 경우가 생겨 이것저것 찾아보다 touchlistener를 사용해 개발하게 되었다.

 

 NestedScrollView creditScrollView = creditDialog.findViewById(R.id.creditScrollView);
 final ObjectAnimator[] anim = {null};
 
 creditScrollView.post(new Runnable() {
            @Override
            public void run() {
                creditScrollView.setScrollY(creditLogo.getTop() - 20);
                anim[0] = ObjectAnimator.ofInt(creditScrollView, "scrollY", creditLayout.getBottom()).setDuration(20000);
                anim[0].start();

                creditScrollView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        switch (event.getAction()) {
                            case MotionEvent.ACTION_CANCEL:
                                // 화면에서 손가락을 땜, 모든 이벤트의 끝
                            case MotionEvent.ACTION_UP:
                                // 상동
                                Handler mHandler = new Handler();
                                mHandler.postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                                        if(!anim[0].isStarted()) {
                                            anim[0].start();
                                        }
                                        scrollStop = true;
                                    }
                                }, 200);
                                break;

                            case MotionEvent.ACTION_DOWN:
                                // 화면에 손가락이 닿음, 모든 이벤트의 출발점
                                break;

                            case MotionEvent.ACTION_SCROLL:
                            case MotionEvent.ACTION_MOVE:
                                // 화면에 손가락이 닿은 채로 움직이고 있음
                                if(anim[0].isStarted() && scrollStop) {
                                    anim[0].pause();
                                    anim[0].cancel();
                                    anim[0] = ObjectAnimator.ofInt(creditScrollView, "scrollY", creditLayout.getBottom()).setDuration(20000);
                                    scrollStop = false;
                                }
                                break;
                        }
                        return false;
                    }
                });
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    creditScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
                        @Override
                        public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                            if(!scrollStop) {
                                creditScrollView.smoothScrollTo(scrollX, scrollY);
                            }
                        }
                    });
                }
            }
        });

 

이후에 사용자가 다시 스크롤뷰가 있는 화면을 볼 수도 있으니 꼭 ObjectAnimator를 초기화 해주자

 

creditDialog.dismiss();
  if(anim[0] != null) {
    anim[0].pause();
    anim[0].cancel();
    anim[0] = null;
   }
scrollStop = true;
반응형