Установить изображение в RemoteViews

У меня есть некоторые SVG-файлы в моей папке с ресурсами, и мне нужно динамически установить их в моем виджетах (на ImageView).

Я использую эту библиотеку: http://code.google.com/p/svgandroid/

Эта библиотека возвращает изображение или PictureDrawable.

Единственными методами, которые я могу использовать для RemoteView, являются setImageViewBitmap, который, очевидно, принимает растровое изображение.

Я пробовал искать код для преобразования Drawable в Bitmap следующим образом:

PictureDrawable pictureDrawable = svg.createPictureDrawable(); Bitmap bitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(), pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.drawPicture(pictureDrawable.getPicture()); currentBitmap = bitmap; 

Но растровое изображение слишком мало. Когда я создаю растровое изображение в Illustrator, я устанавливаю размер монтажной области до 65, что и происходит на внутренней ширине / высоте.

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

  Bitmap bitmap = Bitmap.createBitmap(300, 300, Config.ARGB_8888); 

То получившееся растровое изображение просто содержит кучу пробелов внизу и справа от маленького изображения.

Думаю, мне нужно как-то нарисовать картинку с увеличенным значением, а также создать битмап размером 300. В идеале я мог бы определить размер ImageView во время выполнения и установить растровое изображение соответствующего размера, если бы знал это. Это лучший подход и как я могу это сделать? Возможно, есть лучший подход, о котором я даже не знаю?

Я не использовал android-svg но если он использует vanilla PictureDrawable s, то это должно быть просто вопросом не использования внутренних границ.

Попробуйте следующее:

 PictureDrawable pictureDrawable = svg.createPictureDrawable(); Bitmap bitmap = Bitmap.createBitmap(300, 300, Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); pictureDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); pictureDrawable.draw(canvas); // do not access the Picture directly, that defeats the purpose currentBitmap = bitmap; 

Короче говоря, используйте Drawable, а не его изображение, и установите границы Drawable как полный холст.

Вы пробовали createScaledBitmap?

createScaledBitmap ()

Я пробовал svg-android и это не сработало для меня именно по этой причине. Не говоря уже о его сильно ограниченном наборе функций.

Точка использования векторной графики заключается в том, что я могу генерировать изображения любого подходящего размера, чтобы соответствовать размеру UI View. Это означает, что метод генерации должен принимать требования к размеру во время выполнения и не всегда использовать width , height объявленную в <svg> .

Следовательно, я использовал встроенную реализацию: libsvg-android , которая именно это делает.

Он непосредственно отображает холст с заданным размером:

 long objId = SvgRaster.svgAndroidCreate(); SvgRaster.svgAndroidParseBuffer(objId, readString(mInputStream, "UTF-8")); SvgRaster.svgAndroidSetAntialiasing(objId, true); SvgRaster.svgAndroidRenderToArea(objId, mCanvas, 0, 0, mWidth, mHeight); 

Я закончил тем, что изменил базовый размер Artboard равным 300. Ни один из методов масштабирования не работал. Таким образом, последний код, который я использовал, был тем, что я изначально опубликовал:

 PictureDrawable pictureDrawable = svg.createPictureDrawable(); Bitmap bitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(), pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.drawPicture(pictureDrawable.getPicture()); currentBitmap = bitmap; 

Как только у меня был бит 300×300 Bitmap, я смог установить его в RemoteViews с помощью setImageViewBitmap.

Этот тип победил цель использования SVG в первую очередь (по крайней мере, насколько они были использованы в виджетах).

Моя проблема была не такой, как User117. Возможно, он не назвал границы внешнего слоя, как это требовалось в библиотеке. В любом случае, мне удалось заставить библиотеку работать, хотя и пришлось изменить размер страницы SVG.

Надеюсь, с увеличением разрешения экрана Android скоро представит SVG в рамках платформы.