2016-11-17 4 views
1

У меня есть набор изображений, загружаемых через Glide.Есть ли способ заставить gif загрузить с Glide, чтобы быть не анимированным

NSFW размыты с использованием растрового преобразования скольжения (wasabeef), однако некоторые из них могут быть анимированными gif, и в этом случае первый кадр отображается размытым, а затем анимация начинает зацикливаться (не размывается).

Ниже то, что я пытался и не работает:

DrawableTypeRequest<String> builder = Glide.with(mImage.getContext()).load(...); 

if (entry.isNsfw()) { 
    builder.asBitmap(); 
} 

builder.diskCacheStrategy(DiskCacheStrategy.SOURCE) //it's likely none of this is relevant 
    .skipMemoryCache(true) 
    .override(props.getWidth(), props.getHeight()); 

if (entry.isNsfw()) { 
    //successfully blurs nsfw images, but still allows unblurred animation 
    builder.dontAnimate().bitmapTransform(centreCrop, blur); 
} else { 
    builder.centerCrop(); 
} 

builder.crossFade(500) //moving crossfade only into the sfw posts has no effect 
     .into(mImage); 

Также не работает перехватывает нагрузку:

builder.listener(new RequestListener<String, GlideDrawable>() { 
    @Override 
    public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 
     return false; 
    } 

    @Override 
    public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
     if (entry.isNsfw()) { 
      target.onResourceReady(resource, null); //If I add this and return true the image is static, but unblurred 
      resource.stop(); //if this is called before target, it has no effect 
      return true; 
     } 
     return false; //returning true without calling the target stops any of the images being set on the view 
    } 
}); 

Как я могу отключить воспроизведение GIF для отдельных изображений в то время как все еще сохраняя размытие?

+0

Вы пытались вернуть 'истину' метод' onResourceReady'? Возврат 'false' будет выполнять поведение по умолчанию. Также проверьте [this] (https://github.com/bumptech/glide/issues/1107#issuecomment-205735933) –

+0

Возврат true останавливает изображение, установленное на цель. Использование asBitmap также не имело эффекта, я обновлю код в своем примере, чтобы показать другие вещи, которые я пробовал сейчас –

ответ

0

В конце, смешав несколько шагов, изложенных в моем вопросе, исправлена ​​проблема. Анимированные gifs NSFW теперь отображают только первый кадр, который успешно размыт.

DrawableRequestBuilder<String> builder = Glide.with(ctx).load(...); 
if (nsfw) { 
    builder.bitmapTransform(new BlurTransformation(ctx, 8, 16), new CentreCrop(...)); 
} else { 
    builder.centerCrop(); 
} 
builder.listener(new RequestListener<String, GlideDrawable>() { 
    ... //onException method 
    @Override 
    public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
     boolean handled = false; 
     if (nsfw && resource.isAnimated()) { 
      target.onResourceReady(new GlideBitmapDrawable(null, ((GifDrawable) resource).getFirstFrame()), null); 
      handled = true; //glide now won't set the resource on the target itself 
     } 
     return handled; 
    } 
}); 
builder.crossFade(500).into(mImageView); 
0

У меня есть набор изображений, загружаемый с помощью Glide

Из вышесказанного, я предполагаю, что вы используете RecyclerView, чтобы показать эти изображения, и мой ответ основан на этом предположении.

Попробуйте с мишенью пользовательских Glide свой собственный, который останавливает анимацию, если NSFW как этот

public class CustomTarget extends GlideDrawableImageViewTarget { 

    private boolean isNSFW; 

    public CustomTarget(ImageView view) { 
     super(view); 
    } 

    public void setNSFW(boolean isNSFW){ 
     this.isNSFW = isNSFW; 
    } 

    @Override 
    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) { 

     // this super call loads the image, sets it to the ImageView and starts 
     // animating if it is Gif 
     super.onResourceReady(resource, animation); 

     if(isNSFW){ 
      onStop(); // stop playing the animation if NSFW 
     } 
    } 
} 

А на ваш взгляд класса Holder, создать и сохранить ссылку на эту цель, как вы могли бы сделать для других просмотров

public class MyViewHolder extends RecyclerView.ViewHolder { 

    ImageView myImageView; 
    CustomTarget myCustomTarget; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     myImageView = (ImageView) itemView.findViewById(R.id.myIv); 
     myCustomTarget = new CustomTarget(myImageView); 
    } 
} 

Затем в onBindViewHolder сделать следующее

public void onBindViewHolder(MyViewHolder holder, int position) { 

    // get the current entry in your image set 
    final Entry entry = entries.get(position); 

    // call this before loading the resource 
    holder.myCustomTarget.setNSFW(entry.isNSFW()); 

    // No need to specify asGif() 
    // Refer http://stackoverflow.com/a/34870817/3533289 
    Glide.with(context) 
      .load(entry.getURL()) 
      .into(holder.myCustomTarget); 

} 

Я сам не тестировал это решение. Но я надеюсь, что это даст вам представление о том, как решить эту проблему.

+0

Спасибо, к сожалению, это не поможет. Дело не в том, что у меня нет доступа к фрейму NSFW, это означает, что stop() не работает. Пользовательская цель здесь не помогает, так как даже если stop() работает, мы будем проходить мимо размытого кадра –