AppCompat 23.2 использует VectorDrawableCompat с RemoteViews (AppWidget) в API <21

У меня есть AppWidget, и я хотел бы использовать VectorDrawables в нем также на устройствах pre-Lollipop. VectorDrawableCompat не будет работать с создаваемыми мной RemoteView.

Чтобы уменьшить размер APK моего приложения, я не хочу добавлять альтернативные PNG-версии моих чертежей для более старых платформ API.

Как я могу это сделать?

ОБНОВЛЕНИЕ 05/09/2016

Как отметил @ kirill-kulakov в своем ответе, последние обновления библиотеки поддержки ограничили видимость TintContextWrapper своим собственным пакетом. Я обновляю свой ответ, чтобы удалить неправильный код, но, пожалуйста, благодарите Кирилла за исправление!

VectorDrawable и RemoteViews pre-Lollipop

Вы можете избежать добавления альтернативных растрированных версий ваших векторных ресурсов с помощью простого взлома : используйте AppCompat TintResources через TintContextWrapper, используя AppCompatDrawableManager .

TintResources AppCompatDrawableManager – это класс, который среди прочего, на устройствах pre-Lollipop, анализирует XML-файлы VectorDrawable и преобразует их в экземпляры VectorDrawableCompat, которые можно использовать вплоть до API 7.

Затем, как только у вас есть экземпляр VectorDrawableCompat , растрируйте его на Bitmap. Позднее вы будете использовать это растровое изображение в удаленном ImageView .

Прежде чем мы начнем: Библиотека AppCompat

Убедитесь, что вы используете Android Studio 2.0+ и настроили файл приложения build.gradle следующим образом:

 android { defaultConfig { vectorDrawables.useSupportLibrary = true } } dependencies { compile 'com.android.support:appcompat-v7:23.3.0' } 

Обновите приложение AppWidgetProvider

Прежде всего: не устанавливайте свои векторные ресурсы в файле макета RemoteViews (ни android:src ни app:srcCompat будет работать). Вам нужно будет установить их программно.

Внутри вашего класса AppWidgetProvider установлен векторный ресурс или растрированная версия в зависимости от уровня API:

 RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.appwidget_layout); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { remoteViews.setImageViewResource(R.id.imageView, R.drawable.vector); } else { Drawable d = AppCompatDrawableManager.get().getDrawable(context, R.drawable.vector); Bitmap b = Bitmap.createBitmap(d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); d.setBounds(0, 0, c.getWidth(), c.getHeight()); d.draw(c); remoteViews.setImageViewBitmap(R.id.imageView, b); } 

Рекомендации

  • Исходный код AppCompatDrawableManager
  • Приложение AppCompat от Chris Banes v23.2 – Век вектора в векторе вводит VectorDrawableCompat и объясняет хак, который использует AppCompat, чтобы заставить их работать на устройствах pre-Lollipop.

Следующий метод конвертирует vector drawable можно использовать для растрового изображения раньше, это должно сделать трюк.

 public static BitmapDrawable vectorToBitmapDrawable(Context ctx, @DrawableRes int resVector) { return new BitmapDrawable(ctx.getResources(), vectorToBitmap(ctx, resVector)); } public static Bitmap vectorToBitmap(Context ctx, @DrawableRes int resVector) { Drawable drawable = AppCompatDrawableManager.get().getDrawable(ctx, resVector); Bitmap b = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); drawable.setBounds(0, 0, c.getWidth(), c.getHeight()); drawable.draw(c); return b; } 
Intereting Posts
Никаких дополнительных функций в Activity.getIntent () при возврате к нему из дочернего объекта. Android MediaPlayer: поток и запись в файл в одно и то же время. Детский фрагмент автоматически уничтожается Android: запись текста в txt Есть ли какой-либо плагин в Android Studio для создания подпапок Layout? SwipeRefreshLayout Got Action_Move зависает просмотр Невозможно изменить целевой API в AVD Manager Как остановить соединение HttpURLConnection на Android Создание класса помощника TypeFace Настройка Android с TextView для текста на иврите? Реагировать собственные свойства textDecoration, не работающие на Android Пользовательский интерфейс активности обновления Android от службы Разница между версиями подписей – V1 (подпись Jar) и V2 (полная подпись APK) при генерации подписанного apk в AndroidStudio? Как я могу создать собственный сервер магазина приложений Android? NullPointerException при отражении во время запуска Robolectric – любые подсказки?