Получение растрового изображения из ресурса SVG Url

Я пытаюсь использовать Glide, чтобы получить ресурс SVG из URL-адреса, но я не знаю, как получить объект Bitmap вместо того, чтобы загружать его в представление.
Причина этого в том, что мне нужно загрузить несколько файлов SVG на виджете.

Я использовал этот пример: https://stackoverflow.com/a/30938082/3346625

ОБНОВЛЕНИЕ 1: установка GenericRequestBuilder

            final RemoteViews fViews = views;
            final int fViewId = viewId;

            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {

                    GenericRequestBuilder<Uri, InputStream, SVG, Bitmap> requestBuilder;

                    requestBuilder = Glide.with(mContext)
                            .using(Glide.buildStreamModelLoader(Uri.class, mContext), InputStream.class)
                            .from(Uri.class)
                            .as(SVG.class)
                            .transcode(new SvgBitmapTranscoder(), Bitmap.class)
                            .sourceEncoder(new StreamEncoder())
                            .cacheDecoder(new FileToStreamDecoder<SVG>(new SvgDecoder()))
                            .decoder(new SvgDecoder())
                            .placeholder(R.drawable.ic_launcher)
                            .error(R.drawable.no_icon)
                            .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                            .load(Uri.parse(url));

                    requestBuilder.into(new SimpleTarget<Bitmap>() {
                                @Override
                                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                                    fViews.setImageViewBitmap(fViewId, resource);
                                }
                            });
                }
            };
            mainHandler.post(myRunnable);
  • Мне пришлось использовать Runnable, поскольку requestBuilder.into должен работать в основном потоке.

Как я могу получить растровое изображение, чтобы позже использовать его с RemoteView?


person Carlos Jimenez    schedule 01.10.2015    source источник
comment
Подождите, если вы уже не в сети, зачем вам использовать Glide? Вероятно, проще просто получить сетевой поток и самостоятельно декодировать SVG. Или, если вы уже на главной, зачем вы пишете на главную?   -  person TWiStErRob    schedule 02.10.2015
comment
Я также сделал это, запустил AsyncTask, получил файл svg, а затем использовал парсер SVG, но пришел к той же проблеме, изображения не отображаются. Не знаю, потому что я должен использовать RemoveViews как окончательный.   -  person Carlos Jimenez    schedule 02.10.2015
comment
Тогда, похоже, у вас совсем другая проблема. Суть в том, что вы должны выполнить views.setImageViewBitmap раньше, чем manager.updateAppWidget(ids, views). В настоящее время это выглядит так, как будто вы запускаете Runnable, который затем запускает асинхронную загрузку Glide, и сразу после этого вы вызываете updateAppWidget, даже не давая шанса выполнить запрос Runnable или Glide. Это означает, что manager получает представления без набора растровых изображений, обновляет виджет(ы), а затем некоторое время спустя для реального растрового изображения устанавливается значение RemoteViews, но это будет просто сборщиком мусора.   -  person TWiStErRob    schedule 02.10.2015
comment
Возможно, вы правы, но у меня есть изображения PNG, которые правильно загружаются через Glide и setImageViewBitmap, в этом случае я предполагаю, что Glide также возвращается с ресурсами после вызова updateAppWidget.   -  person Carlos Jimenez    schedule 02.10.2015
comment
Возможно, но это может быть просто удача или попадание в кеш памяти, что похоже на немедленную загрузку. Попробуйте поставить .skipMemoryCache(true).diskCacheStrategy(NONE) на эту загрузку Glide, чтобы доказать, что она будет работать во всех случаях, особенно в первом после установки. В качестве еще одной проверки SVG вы можете попробовать сохранить растровое изображение на диск (bmp.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(filename))), чтобы увидеть, есть ли в нем вообще какой-либо контент, как вы ожидаете.   -  person TWiStErRob    schedule 02.10.2015
comment
При использовании skipMemoryCache и diskCacheStrategy NONE он загружается нормально, но иногда показывает некоторые исключения нулевого указателя IBinder. Также подтверждено, что код, который я использую, правильно сохраняет растровое изображение на диск, все изображения загружаются нормально, но не отображаются в виджете коллекции.   -  person Carlos Jimenez    schedule 02.10.2015
comment
Я только что заметил, что вы сказали виджет коллекции, если вы имеете в виду этот, тогда должно применяться вышеизложенное, то есть setImageViewBitmap должен быть вызван до возврата RemoteViews из getViewAt(), что может быть проблематично.   -  person TWiStErRob    schedule 02.10.2015
comment
Идея о том, как доставить растровые изображения в виджет коллекции: создайте класс модели, который содержит URL-адрес и растровое изображение изображения, и сделайте загрузку изображений частью заполнения коллекции, то есть не сообщайте виджету, что данные адаптера готовы, пока все растровые изображения загружены. Это означает, что вам нужно заполнить поле изображения модели к моменту вызова getViewAt, чтобы Bitmap можно было установить просто синхронно внутри метода.   -  person TWiStErRob    schedule 02.10.2015


Ответы (1)


Попробуй это:

.transcode(new SvgBitmapTranscoder(), Bitmap.class)

.into(new SimpleTarget<Bitmap>(sizeW, sizeH) {
    @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
        // update RemoteViews with resource
    }
})

SvgBitmapTranscoder должен быть довольно тривиальным, если есть метод svg.renderToBitmap().

person TWiStErRob    schedule 01.10.2015
comment
Это не работает, я обновил исходный вопрос кодом, который использовал в соответствии с вашим предложением. - person Carlos Jimenez; 02.10.2015
comment
Кого это может касаться: на основе комментариев выше это решение в целом работоспособно (также подтверждено, что код, который я использую, правильно сохраняет растровое изображение на диск), проблема, похоже, заключается в доставке полученного растрового изображения в виджет приложения. - person TWiStErRob; 02.10.2015