photoview library

2020. 12. 9. 12:12 안드로이드/개발 TIP


우리가 흔히 사진에 줌 기능을 넣을 때 쓰는 라이브러리가 chrisbanes 의 PhotoView다.


https://github.com/chrisbanes/PhotoView



사용을 위해 간편하게 디펜던시에 추가하면 끝 


compile 'com.commit451:PhotoView:1.2.4'



사용법도 간편하다


ImageView iv = (ImageView) findViewById(R.id.imageView);
Drawable bitmap = getResources().getDrawable(R.drawable.wallpaper);
iv.setImageDrawable(bitmap);
PhotoViewAttacher mAttacher = new PhotoViewAttacher(mImageView);

ImageView를 가지고 PhotoViewAttacher를 생성하면 된다.


하지만 더 간편한 방법이 있다.


<uk.co.senab.photoview.PhotoView
android:id="@+id/widget_photoview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:layout_gravity="center"/>

이렇게 layout에 미리 생성하면 된다.


그러면 photoview에 대한 id만 찾아서 쓰면된다.

사용법은 아래와 같다.

PhotoView photoView = (PhotoView) view.findViewById(R.id.widget_photoview);
Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(photoView);


Viewpager에 PhotoView를 이용하여 슬라이드 구현을 많이 하게되는데


간혹 java.lang.IllegalArgumentException: pointerIndex out of range 에러가 떨어질 때가 있다.

구글링하여 보니 viewpager와 photoview간의 버그라고 한다.


처리방법은 viewpager를 상속받는 class를 생성한 뒤 예외처리를 하면된다.


방법은 아래와 같다.

public class CustomViewPager extends ViewPager {

public CustomViewPager(Context context) {
super(context);
}

public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
try {
return super.onTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
}



출처: https://akaisun.tistory.com/20?category=622886 [아카이의 개발창고]