PhotoView의 문제점

PhotoView 라이브러리를 사용하다보니 레이아웃 변경시 매트릭스 상태가 보존되지 않는 버그가 있었다.
대안으로 SubsamplingScaleImageView 라이브러리는 레이아웃 변경시에도 상태가 유지되는 것을 확인했다. 

하지만 난 PhotoView를 쓰고싶다.

문제되는 상황을 살펴보자.

위와 같은 화면을 만들고 있다. 화면을 클릭하면 window의 decorView에 접근하여 System UI를 hide/show 하고 있다. 하지만 decorView의 상태를 변경할 때마다 하위 View들이 영향을 받고 onLayout()이 호출되는 것을 확인했다. 

PhotoView는 onLayout()이 호출 되면 Matrix가 초기화 된다. 이 부분이 통점이다.

해결방법

구글링을 해보았지만 내상황과는 다 맞지 않는다. 그래서 다음과 같이 1차원적인 방법으로 해결했다.

상태를 저장 -> onLayout() 호출 확인 -> 상태 복원

코드는 다음과 같다.

val photoView:PhotoView? = ...
val matrix = Matrix()
photoView?.attacher?.getSuppMatrix(matrix)
photoView?.addOnLayoutChangeListener(object : View.OnLayoutChangeListener {
    override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) {
        photoView.attacher?.setDisplayMatrix(matrix)
        photoView.removeOnLayoutChangeListener(this)
    }
})

System UI를 변경하기 전에 Matrix를 저장하고, 레이아웃 변경 리스너를 등록하여 Matrix를 복원하고 리스너를 해제했다. 

결과를 확인하자.

카테고리: 미분류

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.