Análise completa do uso do Glide4

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_STATENã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 ExternalPreferredCacheDiskCacheFactorypara armazenar o cache do Glide no cartão SD público, você precisa adicionar WRITE_EXTERNAL_STORAGEpermissõ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 annotationProcessordependência regular:

dependencies {
  kapt 'com.github.bumptech.glide:compiler:4.8.0'
}

build.gradleVocê 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.
RequestBuilderA 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);

RequestOptionsUsado para fornecer opções individuais para personalizar o carregamento do Glide. Como apply()o método pode ser chamado várias vezes, RequestOptionpode ser combinado. Se RequestOptionshouver configurações conflitantes entre os objetos, somente a última aplicada RequestOptionsterá 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()e optionalCircleCrop()e centerCrop(),
centerInside(), fitCenter()e circleCrop(): centerCrop()etc. lançará uma exceção ao transformar um tipo de imagem desconhecido, mas optionalCenterCrop()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á CircleCropo 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

Adicione uma descrição da imagem

sobrepor()

É usado para especificar o tamanho de uma imagem (em px), que pode ser usado para Target.SIZE_ORIGINALindicar 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.BitmapTransitionOptionswithCrossFade()TransitionFactory
DrawableTransitionOptionsBitmapTransitionOptionswithTransitionFactory

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 errorsolicitação não será iniciada. Se você especificar thumbnail() e uma errorsolicitação, a errorsolicitaçã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);

RequestListenerDois 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 falsesignifica que o evento não foi processado e continuará sendo transmitido. Retornar truesignifica que o evento foi processado e não continuará sendo transmitido.

listenerExiste outro método semelhante ao do Glide addListener, a diferença entre eles é que quando vários listenermétodos são chamados, apenas o último listenercallback será chamado, enquanto addListenero método chamará vários addListenerset 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. FutureTargetDepois disso, o método que chamamos FutureTargetpode get()obter o arquivo de imagem baixado. Observação: get()o método bloqueará o thread atual até que o download seja concluído.

referência

Acho que você gosta

Origin blog.csdn.net/lichukuan/article/details/126494245
Recomendado
Clasificación