2015-10-01 2 views
0

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

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

UPDATE 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?

+0

Подождите, если вы уже выключены, почему вы хотите использовать Glide? Вероятно, проще просто получить сетевой поток и самостоятельно декодировать SVG. Или, если вы уже на самом деле, почему вы отправляете сообщение на главную? – TWiStErRob

+0

Я также сделал это, запустил AsyncTask, получил файл svg, а затем использовал парсер SVG, но пришел к той же проблеме, изображения не отображаются. Не знаю, связано ли это с тем, что я должен использовать RemoveViews как final. –

+0

Тогда, похоже, у вас совершенно другая проблема. Ключ в том, что вы должны иметь 'views.setImageViewBitmap' выполнить раньше, чем' manager.updateAppWidget (ids, views) '. В настоящее время похоже, что вы запускаете Runnable, который затем запускает загрузку async Glide, и сразу после этого вы вызываете 'updateAppWidget', даже не давая возможности либо выполнить Runnable, либо Glide-запрос. Это означает, что «менеджер» получает представления без набора битмапов, обновляет виджеты, а затем через какое-то время реальный битмап установлен на RemoteViews, но это будет просто сбор мусора. – TWiStErRob

ответ

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() метод.

+0

Не работает, я обновил исходный вопрос кодом, который я использовал в соответствии с вашим предложением. –

+2

Кому это может быть интересно: на основе комментариев выше это решение работает в целом («Также проверено, что код, который я использую, правильно сохраняет растровое изображение на диске»), проблема заключается в доставке полученного Bitmap в приложение виджет. – TWiStErRob

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

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