2017-02-16 14 views
0

Я пытаюсь сделать индивидуальное представление, которое отображает несколько изображений в один вид с помощью Fresco. Я прочитал документы и прошел несколько шагов, но моя реализация не работает. Вот код:Fresco multiple images view

public class MultiDraweeView extends View { 

    private static final int MAX_COUNT = 4; 

    private MultiDraweeHolder<GenericDraweeHierarchy> multiDraweeHolder; 
    private ArrayList<GenericDraweeHierarchy> hierarchies; 

    public MultiDraweeView(Context context) { 
     super(context); 
     init(); 
    } 

    public MultiDraweeView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public MultiDraweeView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     multiDraweeHolder = new MultiDraweeHolder<>(); 
     hierarchies = new ArrayList<>(); 
     for (int i = 0; i < MAX_COUNT; i++) { 
      hierarchies.add(new GenericDraweeHierarchyBuilder(getResources()) 
        .build()); 
     } 
    } 

    public void setImageUris(Uri... uris) { 
     multiDraweeHolder.clear(); 
     for (int i = 0; i < (uris.length < MAX_COUNT ? uris.length : MAX_COUNT); i++) { 
      final int j = i; 
      final DraweeHolder<GenericDraweeHierarchy> draweeHolder = DraweeHolder.create(hierarchies.get(i), getContext()); 
      DraweeController controller = Fresco.newDraweeControllerBuilder() 
        .setUri(Uri.parse("http://www.thewrap.com/wp-content/uploads/2015/11/Donald-Trump.jpg")) 
        .setOldController(draweeHolder.getController()) 
        .setControllerListener(new ControllerListener<ImageInfo>() { 
         @Override 
         public void onSubmit(String id, Object callerContext) { 
          Log.e("fresco" + j, "onSubmit"); 
         } 

         @Override 
         public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { 
          Log.e("fresco" + j, "onFinalImageset"); 
          invalidate(); 
         } 

         @Override 
         public void onIntermediateImageSet(String id, ImageInfo imageInfo) { 
          Log.e("fresco" + j, "onIntermediateImageSet"); 
         } 

         @Override 
         public void onIntermediateImageFailed(String id, Throwable throwable) { 
          Log.e("fresco" + j, "onIntermediateImageFailed"); 
         } 

         @Override 
         public void onFailure(String id, Throwable throwable) { 
          Log.e("fresco" + j, "onFailure"); 
         } 

         @Override 
         public void onRelease(String id) { 
          Log.e("fresco" + j, "onRelease"); 
         } 
        }) 
        .build(); 
      draweeHolder.setController(controller); 
      multiDraweeHolder.add(draweeHolder); 
     } 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     Log.e("fresco", "ondraw"); 
     for (int i = 0; i < multiDraweeHolder.size(); i++) { 
      Drawable drawable = multiDraweeHolder.get(i).getTopLevelDrawable(); 
      drawable.setBounds(50 * i, 50 * i, 50 * (i + 1), 50 * (i + 1)); 
      drawable.draw(canvas); 
     } 
    } 

    @Override 
    protected boolean verifyDrawable(@NonNull Drawable who) { 
     return multiDraweeHolder.verifyDrawable(who); 
    } 

    @Override 
    public void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     multiDraweeHolder.onDetach(); 
    } 

    @Override 
    public void onStartTemporaryDetach() { 
     super.onStartTemporaryDetach(); 
     multiDraweeHolder.onDetach(); 
    } 

    @Override 
    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     multiDraweeHolder.onAttach(); 
    } 

    @Override 
    public void onFinishTemporaryDetach() { 
     super.onFinishTemporaryDetach(); 
     multiDraweeHolder.onAttach(); 
    } 
} 

Логика моего кода является недействительным мнение, как только изображение загрузки в onFinalImageSet так перерисовывает. Но Drawables не рисуются. Если затем я отправлю приложение на задний план и снова открою его, так что onStart вызывается снова, шоу Drawables. Я что-то пропустил здесь, или есть какой-то пример пользовательского DraweView, который расширяет View, а не ImageView?

ответ

1

Вы должны установить Drawable.Callback, как описано здесь: http://frescolib.org/docs/writing-custom-views.html

Кроме того, убедитесь, что обратный вызов фактически аннулирует правильно будут. Если вы сделаете недействительным неправильный, это тоже не сработает.

+0

поэтому все, что мне не хватает, это 'draweeHolder.getTopLevelDrawable(). SetCallback (this);' after' draweeHolder.setController (controller); '? –

+0

Да. Вы также можете упростить код, вам не нужно 'ControllerListener'. –

+0

У меня было ощущение, что мне нужно сделать недействительным после установки изображения. спасибо за ответ +1 –

 Смежные вопросы

  • Нет связанных вопросов^_^