Glide
는 애플리케이션에서 이미지를 빠르고 효율적으로 불러올 수 있게 도와주는 라이브러리이다.
다양한 이미지 형식과 데이터 소스를 지원하며, 이미지 로딩과 관련된 다양한 기능을 제공한다. 이번 글에서는 Glide의 기본적인 사용법과 주요 기능에 대해 알아보겠다.
Glide
는 안드로이드 이미지 로딩 라이브러리 중에서 가장 많이 사용되는 라이브러리 중 하나이다.
Glide는 비디오 스틸
, 이미지 및 애니메이션 GIF 가져오기
, 디코딩 및 표시
를 지원한다.
Glide에는 개발자가 거의 모든 네트워크 스택에 연결할 수 있는 유연한 API가 포함되어 있다. 기본적으로 Glide는 사용자 정의 HttpUrlConnection
기반 스택을 사용하지만, Google의 Volley 프로젝트
또는 Square의 OkHttp 라이브러리
에 플러그인하는 유틸리티 라이브러리도 포함한다.
이미지 캐싱
Glide는 이미지를 메모리와 디스크에 캐시한다. 즉, 이미지가 로드되면 다음에 요청할 때 캐시에서 신속하게 검색할 수 있으므로 이미지를 다시 로드할 필요성이 줄어든다.
이미지 크기 조정
이미지 크기를 조정하여 메모리 사용량을 줄이고 성능을 향상시킬 수 있다. 이는 작은 크기로 표시해야 하는 큰 이미지를 로드할 때 특히 유용하다.
이미지 변환
자르기, 회전, 블러 처리와 같이 이미지가 표시되기 전에 이미지에 적용할 수 있는 다양한 이미지 변환을 제공한다.
다양한 이미지 형식 지원
PNG, JPEG 및 GIF를 포함한 다양한 이미지 형식을 지원한다.
네트워크 최적화
올바른 크기와 형식으로 이미지를 다운로드하여 네트워크 사용을 최적화하고 다운로드해야 하는 데이터 양을 줄여준다.
다른 라이브러리와의 통합
Retrofit 및 OkHttp와 같은 다른 라이브러리와 쉽게 통합되어 API에서 이미지를 더 쉽게 로드할 수 있다.
1. 프로젝트의 build.gradle 파일에 Glide 종속성을 추가
implementation 'com.github.bumptech.glide:glide:4.12.0'
1-1. 외부 통신을 통해 이미지를 가져와야 한다면 인터넷 권한을 매니페스트 파일에 추가해준다.
<uses-permission android:name="android.permission.INTERNET" />
2. ImageView에 이미지를 로드
특별한 옵션 없이 단순히 생성해 놓은 뷰에 이미지를 넣는 것이라면 with()
, load()
, into()
로 간단히 표현할 수 있다.
Glide.with(context)
.load(imageUrl)
.into(imageView);
위의 코드에서 context
는 현재 컨텍스트이고 imageUrl
은 로드할 이미지의 URL이며 imageView
는 이미지가 표시되어야 하는 View이다.
with()
: View, Fragment 혹은 Activity로부터 Context를 가져온다.load()
: 이미지를 로드한다. 다양한 방법으로 이미지를 불러올 수 있다. (Bitmap, Drawable, String, Uri, File, ResourId(Int), ByteArray)into()
: 이미지를 보여줄 View를 지정한다.3. (선택 사항) 이미지 변환을 추가
Glide.with(context)
.load(imageUrl)
.apply(RequestOptions.circleCropTransform())
.into(imageView);
다음은 선택사항으로, 위의 코드에서 circleCropTransform()
은 이미지가 표시되기 전에 이미지에 적용할 수 있는 변환의 예시이다.
(크기 조정, 자르기 및 흐림이 포함된다.)
GIF 파일을 불러올 때 보통 raw
디렉토리에 따로 저장해서 사용한다. 하지만, 위의 방법과 마찬가지로 사용해주면 gif 이미지가 실행되지 않는다.
그래서 사용하는 것은 asGif()
이다. 다음과 같이 사용하면 실행되는 것을 확인할 수 있다.
Glide.with(this).asGif().load(R.raw.gif).into(gifView);
이렇게 작성하면 GIF는 무한루프를 돌면서 계속 실행된다. listener
를 이용해 한번만 돌도록 설정해주면 된다.
Glide.with(this)
.asGif()
.load(R.raw.gif)
.listener(new RequestListener<GifDrawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
if (resource != null) {
resource.setLoopCount(1);
}
return false;
}
})
.into(gifView);