Изменить размер редактируемого значка программно

Я показываю некоторые иконки VectorDrawable динамически в моем проекте Android. Однако я не смог масштабировать иконки в слое Java, используя следующий код:

VectorDrawable jDrawable = (VectorDrawable) getContext().getDrawable(nResourceID);

// resize the icon
jDrawable.setBounds(30, 30, 30, 30);

// set the icon in the button view
button.setCompoundDrawablesRelativeWithIntrinsicBounds(jDrawable, null, null, null);

Примечание: Android, как программно изменить размер (масштабировать) значок вектора xml, ответ не решает мою проблему.

1 ответ

jDrawable.setBounds не работает из-за ошибки в Android.

Один из способов преодолеть ошибку - конвертировать VectorDrawable в Bitmap и отобразить это.

Bitmap bitmap = Bitmap.createBitmap(jDrawable.getIntrinsicWidth(), jDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
jDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
jDrawable.draw(canvas);

Тогда используйте это bitmap чтобы отобразить что-то вроде ниже. Сначала преобразовать его в BitmapDrawable

BitmapDrawable bd = new BitmapDrawable(bitmap);
buttonsetCompoundDrawablesRelativeWithIntrinsicBounds(bd, null, null, null);

Также в вашей вспомогательной функции вы можете вернуть bd,

Чтобы использовать его в API до 23, поместите это в build.gradle

vectorDrawables.useSupportLibrary = true 

Это намного проще, по крайней мере, для API > 21. Предположим, что у нас есть VectorDrawable из ресурсов (пример кода для его получения):

val iconResource = context.resources.getIdentifier(name, "drawable", context.packageName)
val drawable = context.resources.getDrawable(iconResource, null)

Для этого VectorDrawable просто установите желаемый размер:

drawable.setBounds(0, 0, size, size)

И показать возможность рисования в кнопке:

button.setCompoundDrawables(null, drawable, null, null)

Вот и все. Но обратите внимание на использование setCompoundDrawables (не встроенной версии)!

Другие вопросы по тегам