Пользовательский вид и анимированный GIF - GIF воспроизводится неправильно

Я реализовал пользовательское представление с DraweeHolder. Я реализовал все обратные вызовы и прослушиватели для своего пользовательского представления (attach/detach/invalidateDrawable/setListener).

Если я установлю URL-адрес изображения GIF для контроллера, он не будет правильно воспроизводить GIF. Он обновляет gif только при перерисовке вида. Я думаю, что анимированный GIF должен иметь какой-то обратный вызов аннулирования или что-то в этом роде.

P.S. Gif работает правильно, если я использую DraweeView. Также все остальные изображения работают правильно в моем пользовательском представлении.

Создание держателя:

private DraweeHolder<GenericDraweeHierarchy> createComponentHolder(View parent, Context context) {
    GenericDraweeHierarchy componentHierarchy = new GenericDraweeHierarchyBuilder(parent.getResources())
            .setRoundingParams(RoundingParams.fromCornersRadius(LayoutHelper.dp(3)).setBorder(Theme.COLOR_MEDIA_BORDER, 1))
            .build();
    DraweeHolder<GenericDraweeHierarchy> holder = DraweeHolder.create(componentHierarchy, context);
    holder.getTopLevelDrawable().setCallback(parent);
    return holder;
}

Настройка контроллера:

PipelineDraweeControllerBuilder controllerBuilder = Fresco.newDraweeControllerBuilder()
            .setImageRequest(MediaHelper.getImageRequest(filePath))
            .setAutoPlayAnimations(true)
            .setControllerListener(controllerListener)
            .setOldController(draweeHolder.getController());

    if (thumbUrl != null) {
        controllerBuilder.setLowResImageRequest(getThumbnailRequest(thumbUrl));
    }

    draweeHolder.setController(controllerBuilder.build());

Запрос изображения:

public static ImageRequest getImageRequest(String filePath) {
    int imageSize = LayoutHelper.dp(100);
    return ImageRequestBuilder.newBuilderWithSource(Uri.fromFile(new File(filePath)))
            .setResizeOptions(new ResizeOptions(imageSize, imageSize))
            .setAutoRotateEnabled(true)
            .build();
}

person Ermat Alymbaev    schedule 12.07.2016    source источник
comment
Вы установили обратные вызовы? Что-то вроде mDraweeHolder.getTopLevelDrawable().setCallback(yourView);   -  person Alexander Oprisnik    schedule 15.07.2016
comment
Как вы можете видеть в первом блоке кода - он устанавливается   -  person Ermat Alymbaev    schedule 15.07.2016


Ответы (1)


Для GIF-файлов нет пользовательского обратного вызова аннулирования, анимированный рисунок просто animated/base/AbstractAnimatedDrawable.java#L493" rel="nofollow noreferrer">аннулирует себя для каждого кадра, поэтому, если вы установите обратные вызовы, инвалидация должна работать.

Однако, если ваш обратный вызов Drawable (в вашем случае parent) не аннулирует правильную область (или все), анимированная аннулирование drawable не будет обновляться правильно. Примером, когда это может произойти, является то, что обратный вызов не знает точного местоположения Drawable и делает недействительной неправильную область. Вы можете попробовать отладить то, что делает Drawable.Callback вашего пользовательского представления, или написать собственный класс Drawable.Callback, который делает недействительным все представление, включая рисуемый GIF.

Кроме того, обязательно переопределите verifyDrawable и выполните все остальные шаги для пользовательских представлений, как описано в Пользовательские представления. Посмотреть документацию.

person Alexander Oprisnik    schedule 01.08.2016
comment
Можете ли вы показать пример, как я могу добавить обратный вызов в анимированный рисунок. - person Rafael; 21.12.2016
comment
Взгляните на frescolib.org/docs/animations.html — здесь показано, как запустить вручную и остановить анимацию. - person Alexander Oprisnik; 23.12.2016
comment
Ваша ссылка мне не очень помогла. Можете ли вы предоставить дополнительные подсказки или пример того, как анимированное представление fresco (GIF внутри изображения Fresco) может сделать недействительным мое собственное родительское представление во время его воспроизведения. - person Rafael; 26.12.2016
comment
Посетите frescolib.org/docs/writing-custom-views.html - Раздел о других обязанностях — это то, что вам нужно. Очень важно установить Drawable.Callback и убедиться, что invalidateDrawable делает недействительным правильный регион. - person Alexander Oprisnik; 26.12.2016
comment
Спасибо, теперь это работает. Переопределение verifyDrawable в родительском представлении внесло изменения. - person Rafael; 26.12.2016
comment
Большой. Я добавил предложение о verifyDrawable в свой ответ. - person Alexander Oprisnik; 26.12.2016