Picasso는 Square에서 개발한 안드로이드 전용 이미지 처리 라이브러리로, 네트워크 또는 로컬 파일에서 이미지를 다운로드하고 캐시하는 기능을 제공한다. 이 라이브러리는 간편한 API 설계와 자동화된 리소스 관리로 인해 이미지 로딩 작업을 크게 단순화한다.
기본 사용법
이미지를 로드하려면 with(), load(), into() 메서드를 조합하여 사용한다.
Picasso.with(context)
.load("https://example.com/image.jpg")
.into(imageView);
주요 옵션 및 기능
- .noFade(): 애니메이션 효과 없이 바로 이미지 표시.
- .resize(width, height): 이미지 크기를 지정된 크기로 조정.
- .onlyScaleDown(): 원본보다 큰 이미지만 축소, 무조건 확대 방지.
- .centerInside(): 전체 이미지가 컨테이너 내에 들어오도록 비율 유지하며 축소.
- .centerCrop(): 중심 부분을 자르며, 전체 영역을 채우되 비율 유지.
- .fit(): 이미지 뷰의 실제 크기에 맞춰 최적의 크기로 조정.
- .priority(Priority.HIGH): 로딩 우선순위 설정 (예: 상단 이미지 우선).
- .tag("list_item"): 요청에 태그를 붙여 스크롤 중 일시 정지/재개 가능.
태그 기반 제어 예제
리스트뷰 스크롤 시 로딩을 일시 정지하고, 정지 후 재개할 수 있다.
// 스크롤 상태 변경 시
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Picasso picasso = Picasso.with(context);
if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
picasso.resumeTag("list_item");
} else {
picasso.pauseTag("list_item");
}
}
액티비티 종료 시 모든 요청 취소:
@Override
protected void onDestroy() {
super.onDestroy();
Picasso.with(context).cancelTag("list_item");
}
고급 기능
- .fetch(): 이미지를 백그라운드에서 로드하지만 화면에 표시하지 않음 (캐싱 목적).
- .get(): 비동기로
Bitmap반환 (메인 스레드에서 호출 불가). - Target:
ImageView대신 콜백으로 결과 받기.
커스텀 변환 처리
이미지에 필터나 형식을 적용하려면 Transformation 인터페이스를 구현한다.
private class BlurTransformation implements Transformation {
private final RenderScript rs;
public BlurTransformation(Context context) {
rs = RenderScript.create(context);
}
@Override
public Bitmap transform(Bitmap source) {
Bitmap blurred = source.copy(Bitmap.Config.ARGB_8888, true);
Allocation input = Allocation.createFromBitmap(rs, blurred, Allocation.MipmapControl.MIPMAP_FULL, Allocation.USAGE_SHARED);
Allocation output = Allocation.createTyped(rs, input.getType());
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
blur.setInput(input);
blur.setRadius(10f);
blur.forEach(output);
output.copyTo(blurred);
source.recycle();
return blurred;
}
@Override
public String key() {
return "blur";
}
}
다중 변환 적용:
List<Transformation> transformations = new ArrayList<>();
transformations.add(new CircleTransformation());
transformations.add(new BlurTransformation(context));
Picasso.with(context)
.load(url)
.transform(transformations)
.into(imageView);
캐시 및 성능 분석
- 캐시 확인:
.setIndicatorsEnabled(true)로 로딩 소스 색상 표시 (파란색=메모리, 초록=디스크, 빨강=네트워크). - 로딩 시간 측정:
.setLoggingEnabled(true)로 디버그 로그 출력. - 사용 통계:
StatsSnapshot snapshot = Picasso.with(context).getSnapshot();로 메모리 사용량 등 정보 확인.
커스텀 설정 및 글로벌 인스턴스
기본 설정을 변경하거나 전역 인스턴스로 사용하려면 Builder를 활용한다.
OkHttpClient client = new OkHttpClient.Builder()
.cache(new Cache(cacheDir, maxSize))
.build();
Picasso picasso = new Picasso.Builder(context)
.downloader(new OkHttp3Downloader(client))
.build();
Picasso.setSingletonInstance(picasso);
다른 라이브러리 비교
- Glide: GIF 지원,
RGB_565기본 포맷으로 메모리 절약, 생명주기 연동. - Fresco: Native 메모리 사용, 진행형 로딩, 고성능 애니메이션 지원.
- Universal Image Loader: 오래됨, 설정 복잡, GIF 미지원.
각 라이브러리의 특징과 용도에 따라 프로젝트 요구사항에 맞는 선택이 필요하다.