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개의 댓글