📱 Android

[Android/kotlin] 특정 위치로 스크롤하기

콩드로이드 2020. 8. 12. 11:00

ScrollView의 특정 UI로 자동 스크롤

ScrollView의 특정 TextView를 클릭하면 특정 위치로 자동스크롤 되게 하기 위해서,

현재 스크롤 위치, 특정 UI로 자동 스크롤

위 2가지를 알아야했습니다.

 

 

Vertical ScrollView를 쓰고 있기 때문에 값은 Y축의 값만 사용합니다.

 

현재 스크롤 위치 구하기

현재 스크롤의 Y축 값은 생각보다 간단하게 구할 수 있는데, 그 값을 가져오기 위해서 ViewTreeObserver를 사용해야합니다.

ViewTreeObserver없이 사용하면 0을 리턴하는 경우가 많기 때문에 ViewTreeObserver를 사용하겠습니다.

 

ViewTreeObserver

각 리스너를 통해 변화를 감지, OnScrollChangeListener 사용

OnScrollChangeListener를 통해 현재 스크롤의 Y값을 프로퍼티에 저장해둡니다.

 

 // 전역으로 선언된 originY에 저장 
 originY = scrollView.scrollY

 

특정 UI로 자동 스크롤

특정 UI의 TOP, BOTTOM, LEFT, RIGHT으로 스크롤 가능

Vertical로 스크롤되기 때문에 현재는 TOP, BOTTOM 둘 중에 선택하면 됩니다.

 

View에서도 top을 사용할 수 있지만 View.top을 사용하면 상대적 위치값이라 정확하지가 않기 때문에, 해당 View의 절대좌표를 구해야합니다.

 

getLocationOnScreen

함수면 그대로 현재 View의 스크린 위에서의 위치를 계산해서 배열에 넣어줌
size가 2인 Int배열이 생성되는데, 0번째는 x좌표 1번째에는 y좌표가 들어가있습니다.

 

val viewLocation = IntArray(2)
val scrollLocation = IntArray(2)
view.getLocationOnScreen(viewLocation) 
scrollView.getLocationOnScreen(scrollLocation)
viewLocation[1] // view의 y좌표
scrollLocation[1] // scrollView의 y좌표

scroll

위 그림을 보면, 기존에 스크롤이 된 상태가 아니라면 신경 쓸 필요가 없지만

만약 스크롤이 된 상태라면 기존에 스크롤 된 값인 ScrollY가 필요합니다.

 

스크롤이 되지 않았을 경우 -> view의 y좌표만 사용

스크롤이 된 경우 -> (기존의 스크롤된 값 + View의 Y좌표)- scrollView의 y좌표

 

스크롤 이동시키기

ObjectAnimator을 사용합니다

 

ObjectAnimator

타겟 객체에서 값을 애니메이션하는 프로세스가 훨씬 쉬워지므로 대체로 이 클래스를 사용

 

Duration을 사용하기 위해 ObjectAnimator를 사용했습니다.

ObjectAnimator.ofFloat(View, "scrollY", scrollY, 스크롤 이동 값).apply {
      duration = 1000 
      start()
  }

 

 

도움받은 블로그

스크롤 관련

 

 

오늘 포스팅은 여기서 마치겠습니다
틀린 부분이나 궁금한 점이 있으시면 댓글 달아주세요 :)