ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] 안드로이드 ImageView 핀치 줌(Pinch Zoom) 기능에 대해
    Android 2019. 3. 28. 21:57

     

    안드로이드 앱 내에서 이미지를 확대하거나, 축소하는 기능을 넣어야 할 때가 있다.

     

    내가 예전에 구현했던 코드에서는 ImageView를 확장해서 만일 두 손가락으로 터치 액션이 발생되면(ACTION_POINTER_DOWN), 두 지점들끼리 거리를 계산한 값을 저장하고, 터치한 손가락의 MOVE 액션(ACTION_MOVE)이 발생될때마다 처음에 터치한 지점의 거리와는 달라지게 되므로, 해당 거리만큼 ImageView.setScaleX(float scale), ImageView.setScaleY(float scale) 메서드를 사용해 확대/축소한다. 한손가락 터치 액션(ACTION_DOWN)이 발생된 경우 ImageView.setPivot(float x, float,y) 메서드로 이미지뷰의 특정지점으로 스크린을 포커스를 이동시키는 방법이 있다.

     

    단순히 사진 앨범 기능을 가진 앱만을 구현할 때는 아래의 라이브러리를 그대로 사용해도 좋을 것 같다.

     

    github의 chrisbanes은 이를 구현한 PhotoView 라이브러리를 배포하고있다. 이 라이브러리의 사용법에 대해서는 해당 링크를 참고할 것.

    이 라이브러리는 간단히 PhotoViewAttacher 생성자에 ImageView 객체를 넘겨줌으로써 Pinch Zoom이 가능하게 만들어준다. 하지만, 만약 지하철 노선도 앱과 같이 핀치줌이 가능하면서 특정 좌표를 터치할 경우 어떤 이벤트가 발생되도록 코드를 작성하려 할 경우에는 이 라이브러리가 적절하지 않을 수도 있다.

     

    이미지의 특정 지점으로 스크린을 옮겼을때 해당 이미지만의 고유한 좌표값을 가져올 수 없다. 이것이 어떤 의미냐면, 해당 지점을 터치했을때 getX, getY메서드로 반환되는 좌표값은 다른 지점으로 이동했을때 좌표값하고 똑같이 나오게 된다는 것이다. 지하철 노선도 앱을 예로 들자면, 실제로 스마트폰 스크린 상에서 해당 역들을 같은 지점에 두기만 한다면 잠실역의 좌표값과 천호역의 좌표값이 똑같이 나온다.

Designed by Tistory.