Pronto para usar
adicionar dependências
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
permissões
<uses-permission android:name="android.permission.INTERNET" />
<!--非必需-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
ACCESS_NETWORK_STATE
Não é necessário que o Glide carregue URLs, mas ajudará o Glide a lidar com redes instáveis e modo avião. Se você estiver carregando imagens de URLs, o Glide pode ajudá-lo automaticamente com conexões de rede instáveis: ele pode monitorar o status da conexão do usuário e reiniciar solicitações com falha quando o usuário se reconectar à rede. Se o Glide detectar que seu aplicativo possui a permissão ACCESS_NETWORK_STATE, o Glide monitorará automaticamente o status da conexão sem alterações adicionais
Se você deseja usar ExternalPreferredCacheDiskCacheFactory
para armazenar o cache do Glide no cartão SD público, você precisa adicionar WRITE_EXTERNAL_STORAGE
permissões.
confundir
-dontwarn com.bumptech.glide.**
-keep class com.bumptech.glide.**{*;}
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
KotlinGenericName
Se você usar anotações Glide em classes escritas em Kotlin, precisará introduzir uma dependência kapt em vez da annotationProcessor
dependência regular:
dependencies {
kapt 'com.github.bumptech.glide:compiler:4.8.0'
}
build.gradle
Você também precisa incluir o plugin em seu arquivo kotlin-kapt
:
apply plugin: 'kotlin-kapt'
RequestBuilder
RequestBuilder
É o esqueleto da requisição no Glide, responsável por carregar a url solicitada e suas configurações para iniciar um novo processo de carregamento.
RequestBuilder
A fonte de é a seguinte:
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment).asDrawable();
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment).load("url");
RequestBuilder<Bitmap> requestBuilder = Glide.with(fragment).asBitmap();
RequestBuilder<GifDrawable> requestBuilder = Glide.with(fragment).asGif();
RequestBuilder<File> requestBuilder = Glide.with(fragment).asFile();
usar
Glide.with(this)
.load("url")
.apply()//设置请求选项
.transition()//设置过渡
.thumbnail()//略缩图相关
.error()//请求出错相关
.listener()或addListener//监听
.into()或submit()//指定目标
RequestOptions
RequestOptions cropOptions = new RequestOptions().centerCrop();
Glide.with(fragment)
.load(url)
.apply(cropOptions)
.into(imageView);
RequestOptions
Usado para fornecer opções individuais para personalizar o carregamento do Glide. Comoapply()
o método pode ser chamado várias vezes,RequestOption
pode ser combinado. SeRequestOptions
houver configurações conflitantes entre os objetos, somente a última aplicadaRequestOptions
terá efeito.
As APIs comumente usadas são as seguintes:
espaço reservado
Placeholders são Drawables que são exibidos enquanto a requisição está sendo executada. Quando a solicitação é concluída com sucesso, o espaço reservado é substituído pelo recurso solicitado
- placeholder(): imagem de espaço reservado, se a solicitação falhar e nenhum erro Drawable for definido, o espaço reservado será exibido continuamente
- error(): Mapa de espaço reservado anormal, exibido quando a solicitação falha permanentemente
- fallback: caractere de retorno de chamada de fallback, exibido quando o url solicitado é nulo
O principal objetivo de projetar um Drawable de fallback é permitir que o usuário indique se nulo é uma condição normal aceitável. Por exemplo, um URL de perfil nulo pode significar que o usuário não tem um avatar definido e, portanto, o avatar padrão deve ser usado. No entanto, nulo também pode indicar que os metadados são simplesmente inválidos ou indisponíveis. Por padrão, o Glide trata null como um erro, portanto, os aplicativos que podem aceitar null devem definir explicitamente um Drawable de fallback.
//placeholder()
Glide.with(fragment)
.load(url)
.placeholder(R.drawable.placeholder)
//.placeholder(new ColorDrawable(Color.BLACK))
.into(view);
//error()
Glide.with(fragment)
.load(url)
.error(R.drawable.error)
//.error(new ColorDrawable(Color.RED))
.into(view);
//fallback
Glide.with(fragment)
.load(url)
.fallback(R.drawable.fallback)
//.fallback(new ColorDrawable(Color.GREY))
.into(view);
Perceber:
- Os espaços reservados são carregados dos recursos do Android no thread principal
- Transformações não são aplicadas a espaços reservados
- O mesmo Drawable sem estado pode ser usado em várias Views diferentes; no entanto, Drawables com estado são diferentes e geralmente não é seguro exibi-los em várias Views ao mesmo tempo, porque várias Views irão modificar (mutar) o Drawable de uma só vez. Para Drawables com estado, é recomendável passar um ID de recurso ou usar newDrawable() para passar uma nova cópia para cada solicitação.
diskCacheStrategy()
Usado para definir o cache do disco rígido, as opções são as seguintes:
- DiskCacheStrategy.NONE: indica que nada está armazenado em cache.
- DiskCacheStrategy.DATA: indica que apenas as imagens originais são armazenadas em cache.
- DiskCacheStrategy.RESOURCE: indica que apenas as imagens convertidas são armazenadas em cache.
- DiskCacheStrategy.ALL : indica que a imagem original e a imagem convertida são armazenadas em cache.
- DiskCacheStrategy.AUTOMATIC: Indica para deixar o Glide escolher de forma inteligente qual estratégia de cache usar de acordo com o recurso de imagem (opção padrão)
skipMemoryCache(booleano)
- verdadeiro: pular memcache
- false : não pule memcache
transformar
transformação padrão
- centerCrop(): Visa preencher todo o controle, redimensiona proporcionalmente, e será cortado quando ultrapassar o controle (a largura e a altura devem ser preenchidas, desde que a proporção da imagem seja diferente da proporção da imagem controle, ele será cortado)
- centerInside(): O objetivo é exibir totalmente a imagem, sem cortar, ela será ampliada quando não puder ser exibida e não será ampliada se puder ser exibida
- fitCenter(): preenche a tela inteira com a proporção original da imagem
- circleCrop(): recorte circular
- transform(): defina uma transformação de imagem personalizada
optionalCenterCrop()
A diferença entre ,optionalCenterInside()
,optionalFitCenter()
eoptionalCircleCrop()
ecenterCrop()
,
centerInside()
,fitCenter()
ecircleCrop()
:centerCrop()
etc. lançará uma exceção ao transformar um tipo de imagem desconhecido, masoptionalCenterCrop()
ignorará o tipo de imagem desconhecido.
múltiplas transformações
transform(new MultiTransformation<>(new CenterCrop(),new CircleCrop()))
transforms(new CenterCrop(),new CircleCrop())
A ordem na qual os parâmetros de transformação são passados determina a ordem na qual essas transformações são aplicadas
transformação personalizada
As transformações personalizadas precisam ser herdadas BitmapTransformation
(e podem ser herdadas Transformation
) e substituir os seguintes métodos:
equals
hashCode
updateDiskCacheKey
transform
A seguir está CircleCrop
o código-fonte do
public class CircleCrop extends BitmapTransformation {
private static final int VERSION = 1;
private static final String ID = "com.bumptech.glide.load.resource.bitmap.CircleCrop." + VERSION;
private static final byte[] ID_BYTES = ID.getBytes(CHARSET);
// Bitmap doesn't implement equals, so == and .equals are equivalent here.
@SuppressWarnings("PMD.CompareObjectsWithEquals")
@Override
protected Bitmap transform(
@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
return TransformationUtils.circleCrop(pool, toTransform, outWidth, outHeight);
}
@Override
public boolean equals(Object o) {
return o instanceof CircleCrop;
}
@Override
public int hashCode() {
return ID.hashCode();
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
messageDigest.update(ID_BYTES);
}
}
glide-transformations é uma excelente biblioteca de transformação personalizada, o efeito da biblioteca é mostrado na figura
sobrepor()
É usado para especificar o tamanho de uma imagem (em px), que pode ser usado para Target.SIZE_ORIGINAL
indicar que a imagem de tamanho original está carregada, mas isso causará o risco de OOM.
Opções de Transição
TransitionOptions são usados para determinar o que acontece entre a transição da imagem de espaço reservado para a imagem de destino quando o carregamento é concluído.
Ao contrário do Glide v3, o Glide v4 não aplicará crossfades ou quaisquer outros efeitos de transição por padrão. As transições devem ser aplicadas manualmente por solicitação.
Glide.with(this)
.load("")
.transition(DrawableTransitionOptions.withCrossFade())
.into(imageView);
- GenericTransitionOptions: opções de transição genéricas
asDrawable()
DrawableTransitionOptions: só pode ser usado quando Glide chama o método (padrão)- BitmapTransitionOptions:
asBitmap()
Só pode ser usado quando Glide chama o método
O Glide implementa apenas o efeito de transição de fade in e fade out, ou seja, o método de chamar ou DrawableTransitionOptions
, caso precise personalizar o efeito de transição, você deve implementá-lo , e usar o método de ou para aplicar seu custom ao carregamento.BitmapTransitionOptions
withCrossFade()
TransitionFactory
DrawableTransitionOptions
BitmapTransitionOptions
with
TransitionFactory
Miniatura
//thumbnail()方法可以简单快速地加载图像的低分辨率版本,并且同时加载图像的无损版本
Glide.with(this)
.asDrawable()
.load("url")
.thumbnail(Glide.with(this).load("thumbnailUrl"))
.into(imageView);
//加载同一个图片,但尺寸为 View 或 Target 的某个百分比的(这里为0.25)
Glide.with(this)
.asDrawable()
.load("url")
.thumbnail(0.25f)
.into(imageView);
erro
Glide.with(fragment)
.load("url")
.error(Glide.with(fragment)
.load("errorUrl"))
.into(imageView);
Inicie uma nova solicitação em caso de falha. Se a solicitação principal for concluída com sucesso, esta error
solicitação não será iniciada. Se você especificar thumbnail() e uma error
solicitação, a error
solicitação de fallback será iniciada se a solicitação principal falhar, mesmo se a solicitação de miniatura for bem-sucedida.
listener e addListener
Glide.with(this)
.load("url")
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
})
.into(imageView);
RequestListener
Dois métodos precisam ser implementados, um onResourceReady()
método e um onLoadFailed()
método. O método será chamado de volta quando a imagem for carregada onResourceReady()
e o método será chamado de volta quando a imagem falhar ao carregar onLoadFailed()
. onResourceReady()
Ambos os métodos e onLoadFailed()
métodos têm um valor de retorno booleano. Retornar false
significa que o evento não foi processado e continuará sendo transmitido. Retornar true
significa que o evento foi processado e não continuará sendo transmitido.
listener
Existe outro método semelhante ao do GlideaddListener
, a diferença entre eles é que quando várioslistener
métodos são chamados, apenas o últimolistener
callback será chamado, enquantoaddListener
o método chamará váriosaddListener
set callbacks por vez.
em sumsubmit
- into(): Baixe a imagem e carregue o recurso no alvo especificado
- submit (): só fará o download da imagem, mas não carregará a imagem
Depois de chamar o método, um objeto
submit()
será retornado imediatamente e, em seguida, o Glide começará a baixar o arquivo de imagem em segundo plano.FutureTarget
Depois disso, o método que chamamosFutureTarget
podeget()
obter o arquivo de imagem baixado. Observação:get()
o método bloqueará o thread atual até que o download seja concluído.