마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Scrollview 자동 스크롤 중 사용자가 스크롤 했을 때 버벅임이 생깁니다

0 추천

엔딩크레딧을 구현 중입니다. 그래서 스크롤뷰를 자동스크롤되게 구현해놓았습니다.

근데 자동 스크롤 중 사용자가 스크롤을 하면 버벅이면서 

I/Choreographer: Skipped 452 frames!  The application may be doing too much work on its main thread.

이렇게 뜹니다.

creditScrollView.post(new Runnable() {
    @Override
    public void run() {
        if(scrollStop) {
            ObjectAnimator.ofInt(creditScrollView, "scrollY", creditLayout.getBottom()).setDuration(25000).start();
        }
    }
});
creditScrollView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;

            case MotionEvent.ACTION_UP:
                Handler mHandler = new Handler();
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        scrollStop = true;
                    }
                }, 100);
                break;

            case MotionEvent.ACTION_MOVE:
                scrollStop = false;
                break;
        }
        return false;
    }
});

 

코드는 이런 식으로 짰습니다. 사용자가 스크롤했을 때 정작 원하는 위치로 가지도 않고 버벅이기만 하고 아래로 스크롤만 되네요 ㅠㅠ

hanix_x (220 포인트) 님이 2020년 5월 20일 질문
hanix_x님이 2020년 5월 20일 수정

2개의 답변

0 추천
 
채택된 답변

디자이너정님이 해주신 답변을 참고해 이리저리 해보다가 성공했습니다.

스크롤 중일 때 아닐 때를 구분해 스크롤 중일 때는 애니메이션을 멈추고 재정의해줬습니다

 

creditScrollView.post(new Runnable() {
            @Override
            public void run() {
                final ObjectAnimator[] anim = {ObjectAnimator.ofInt(creditScrollView, "scrollY", creditLayout.getBottom()).setDuration(25000)};
                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() {
                                        anim[0].start();
                                        scrollStop = true;
                                    }
                                }, 400);
                                break;

                            case MotionEvent.ACTION_DOWN:
                                break;

                            case MotionEvent.ACTION_SCROLL:
                            case MotionEvent.ACTION_MOVE:
                                anim[0].pause();
                                anim[0] = ObjectAnimator.ofInt(creditScrollView, "scrollY", creditLayout.getBottom()).setDuration(25000);
                                scrollStop = false;
                                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);
                                        }
                                    }
                                });

                                break;
                        }
                        return false;
                    }
                });
            }
        });

 

hanix_x (220 포인트) 님이 2020년 5월 21일 답변
hanix_x님이 2020년 5월 21일 채택됨
+1 추천

I/Choreographer: Skipped 452 frames!  The application may be doing too much work on its main thread.

경고 문구 처럼, 앱의 main thread의 특정 루틴에서 CPU 너무 오래동안 잡고 있기 때문입니다.

시간이 걸리는 작업은 다른 thread로 전환해야지, 좋은 UI scroll 성능을 얻을 수 있습니다.

디자이너정 (42,810 포인트) 님이 2020년 5월 21일 답변
감사합니다! 덕분에 도움됐습니다!
...