Я подозреваю, что причина, по которой вы изо всех сил пытаетесь найти нестандартный способ масштабирования фонового изображения, заключается в том, что это обычно не считается хорошей практикой. Масштабирование изображений приводит к появлению артефактов и полос, которые могут сделать ваш пользовательский интерфейс неприглядным. Исключением из этого является Imageview, но я бы сказал, что поддержка масштабирования, предоставляемая этим классом, больше предназначена для поддержки таких вещей, как фотографии или веб-контент (то есть изображения, которые вы не поставляли с приложением).
Ваш макет пользовательского интерфейса должен быть спроектирован таким образом, чтобы любые фоновые изображения на основе ресурсов предварительно масштабировались до правильного разрешения для плотности / размера экрана устройства. Другими словами, вы должны предоставлять несколько версий каждого чертежа для удовлетворения различных плотностей и размеров экрана, используя соглашение об именах папок ресурсов, изложенное в руководстве Поддержка нескольких экранов .
Интерфейс пользователя должен быть разложен таким образом, чтобы любые небольшие различия в размере экрана между устройствами можно было обрабатывать без необходимости масштабировать фоновые изображения его представлений. Очевидно, что я не знаю, как выглядит предложенный вами пользовательский интерфейс, поэтому сложно делать какие-либо конкретные предложения, но обычно я использую простые цвета фона или ShapeDrawable
s для динамического заполнения пространства между представлениями.
Однако, если вы действительно уверены, что хотите масштабировать фоновые изображения, несмотря на вышеизложенную проповедь :-), почему бы не попробовать использовать ScaleDrawable
, чтобы обернуть существующий чертеж?
Если вы знаете высоту и ширину как вашего вида, так и фонового изображения, вы можете сделать что-то вроде:
Drawable backgroundDrawable = getResources().getDrawable(R.drawable.tab_license_off);
tempView.setBackgroundDrawable(
new ScaleDrawable(
backgroundDrawable,
Gravity.CENTER,
tempView.getWidth() / backgroundDrawable.getIntrinsicWidth(),
tempView.getHeight() / backgroundDrawable.getIntrinsicHeight());