Android: как загрузить векторное рисованное изображение в веб-просмотр?
Извините, если это повторение, но я усердно искал и не нашел этот вопрос еще...
Итак, в прежние времена Android вы могли просто добавить что-то вроде этого в исходный HTML-код WebView:
<img src='file:///android_res/drawable/my.png'/>
И он будет правильно отображать my.png в WebView. Но... Android теперь поддерживает (и предпочитает, чтобы мы использовали) эти новомодные векторные рисунки, а Vector Asset Studio в Android Studio позволяет действительно легко импортировать их из файлов SVG или чего-либо еще.
Самое замечательное то, что для обратной совместимости автоматически создаются файлы.png во время сборки для разных размеров экрана / т / д для поддержки старых устройств. Так что, если вы ориентируетесь на старое устройство, там есть изображения.png.
Если бы я только мог добраться до них. Потому что, насколько я могу судить, использование векторной графики ломает эти file:///android_res/drawable/
img
ссылки в WebViews. Что странно, потому что, как я уже сказал, есть файлы.png, которые можно посмотреть, если бы они только выглядели.
Я думал о нескольких способах исправить это, но ни один из них не сработал:
Поскольку.png создаются на лету и включаются в.apk, я подумал, что, возможно, я мог бы указать непосредственно на один из сгенерированных файлов с чем-то вроде
file:///android_res/drawable-hdpi-v4/my.png
, (Я проверил файл.apk, и вот где был один из них...) Но не повезло. Разбитое изображение.Хорошо, я подумал - может быть, есть способ получить WebView для непосредственного отображения векторных объектов. То есть, может быть, WebView распознает
<img src="file:///android_res/drawable/my_image.xml"/>
или что-то подобное. Я имею в виду, Chrome может сделать SVG правильно? Возможно, он также поддерживает векторный формат.xml. Но здесь тоже нет костей. (Даже если бы это сработало, маловероятно, что он будет поддерживать более старые версии до хрома.)Третье, что я попробовал, это включить только один.png размером xxxhdpi в
res/drawable
чтобы веб-просмотр нашел его и, надеюсь, отобразил. К сожалению, это тоже не работает. Похоже, что просто наличие вектора XML/drawable
достаточно, чтобы он заблокировал PNG, независимо от того, находится ли он в/drawable
или же/drawable-xxxhdpi
каталоги.
Итак, очевидный вопрос: есть ли способ заставить WebView отображать векторный xml (или связанный с ним файл поддержки.png, который был сгенерирован)? Как нам получить доступ к чертежам из HTML в WebView с векторными чертежами? Особенно без необходимости делать что-либо программно?
Кто-нибудь знает, как это должно работать? Я думаю, что следующее, что нужно сделать, это углубиться в источник хрома / Android, чтобы попытаться выяснить, как file:///android_res/drawable/
работает, но это не звучит весело, так что если у кого-то есть ответ, это было бы полезно.
Я, наверное, упускаю что-то действительно очевидное здесь Спасибо заранее!
Обновление: Другие вещи, которые я пробовал / исключал, включают (1) удаление подчеркиваний в именах изображений (как я думал, они могут быть заменены на "/"), (2) различные перестановки baseurl в loadDataWithBaseUrl()
0 ответов
Что ж, четыре года спустя, и лучшее решение, которое я нашел, это просто иметь два векторных файла: (1) векторный файл xml Android для приложения, а затем (2) идентичное изображение в .svg
формат для веб-просмотра. Это все еще меньшее решение по сравнению с предоставлением отдельного .png
или же .gif
для каждого dpi и т. д.
SVG и векторный формат внутренне очень похожи, поэтому нетрудно конвертировать один в другой. Фактически, Android Studio будет конвертировать SVG->XML. Если вы хотите пойти другим путем, сравните несколько примеров.
Так что просто поместите ваши SVG в assets/svg/
, а затем вы можете получить доступ из веб-просмотра, используя <img src='file:///android_asset/svg/mysvg.svg'/>
в вашем HTML.
Там все еще хит хранилища. Но svgs относительно крошечные (и вы можете минимизировать их, т. Е. Вычеркнуть часть лишнего пуха в файле SVG, который не используется веб-представлением), так что это не так плохо, как альтернатива - предоставление больших двоичных файлов изображений в апк.