Android изменить размер drawable

Как я могу сжать drawable на кнопке?

Как я могу сделать drawable на кнопке меньше? Значок слишком большой, на самом деле выше, чем кнопка. Это код, который я использую:

чем выше он должен выглядеть, тем ниже он выглядит прямо сейчас.

Я пробовал это, но изображение отсутствует. : — (

14 ответов:

вы должны использовать ImageButton и укажите изображение в android:src и set android:scaletype до fitXY

установка масштабируемого чертежа в коде

я нашел очень простое и эффективное решение XML, которое не требует ImageButton

сделайте рисованный файл для вашего изображения, как показано ниже, и используйте его для android:drawableLeft

вы можете установить размер изображения с android:width и android:height свойства.

таким образом, вы могли бы по крайней мере получить тот же размер на разных экранах.

недостатком является то, что он не совсем похож на fitXY, который будет масштабировать ширину изображения, чтобы соответствовать X и масштабировать высоту изображения соответственно.

кнопки не изменяют размер своих внутренних изображений.

мое решение не требует обработки кода.

он использует макет с TextView и ImageView.

фон макета должен иметь красный 3d drawable.

возможно, Вам потребуется определить android: scaleType атрибут xml.

  1. подсчет различных значков разрешения может привести к предсказуемый пользовательский интерфейс (значок слишком большой или слишком маленький)
  2. текст в textview (включая кнопки) не заполняет компонент. Это проблема Android и я не знаю, как ее решить.
  3. вы можете использовать его как включить.

мой DiplayScaleHelper, который отлично работает:

проблема в том, что drawable не показывает тогда — это какая-то ошибка в ScaleDrawables. вам нужно будет изменить «уровень» программно. Это должно работать для каждой кнопки:

можно назвать setBounds на» составных » чертежах изменить размер изображения.

попробуйте этот код для авторазмера drawable вашей кнопки:

определяется этой функцией:

имейте в виду, что это не может быть вызвано в onCreate() активности, потому что высота и ширина кнопки там (пока) недоступны. Вызовите это на onWindowFocusChanged() или использовать данное решение для вызова функции.

редактировать:

первое воплощение этой функции не работает правильно. Он использовал код userSeven7s для масштабирования изображения, но возвращает ScaleDrawable.getDrawable() не работает (как и возвращение ScaleDrawable ) для меня.

модифицированный код использует setBounds обеспечить границы для изображения. Android вписывает изображение в эти границы.

Если вы хотите использовать 1 изображение и отображать его в разных размерах, вы можете использовать масштабирование drawable ( http://developer.android.com/guide/topics/resources/drawable-resource.html#Scale).

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

вы пробовали обернуть свое изображение в ScaleDrawable а затем использовать его в вашей кнопке?

вот функция, которую я создал для масштабирования векторные рисунки. Я использовал его для установки TextView compound drawable.

С помощью функции «пакетный DRAWABLE IMPORT» вы можете импортировать пользовательский размер в зависимости от вашего требования пример 20dp*20dp

Читайте также:  Суперпользователь для андроид установить

теперь после импорта используйте импортированный drawable_image как drawable_source для вашей кнопки

так проще

Это потому, что вы не setLevel . после тебя setLevel(1) , он будет отображаться как u хотите

Я сделал собственный класс button для достижения этой цели.

использование в xml

я попробовал методы этого поста, но не нашел ни одного из них настолько привлекательным. Мое решение состояло в том, чтобы использовать imageview и textview и выровнять imageview сверху и снизу к textview. Таким образом, я получил желаемый результат. Вот код:

Источник

Находки программиста

Решения конкретных задач программирования. Java, Android, JavaScript, Flex и прочее. Настройка софта под Linux, методики разработки и просто размышления.

воскресенье, 30 октября 2011 г.

Android: Как изменить размер BitmapDrawable

Недавно мне понадобилось получить из внешнего потока (InputStream) картинку и вывести ее на экран, но картинка была в одном размере и ее нужно было под разные экраны и условия уменьшить или увеличить.

Для начала получим из потока Drawable. Например с assets каталога:

Drawable drawable = Drawable.createFromStream(act.getAssets().open(fileName), null );

public static Drawable resizeDrawable(Drawable drawable, int newWidth, int newHeight) <
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float scaleWidth = (( float ) newWidth) / width;
float scaleHeight = (( float ) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap .createBitmap(bitmap, 0, 0,
width, height, matrix, true );
return new BitmapDrawable(resizedBitmap);
>

Этот метод я запостил скорей чтобы не забыть, потому как в проекте он уже не нужен, и дабы помочь ищущему. Но я думаю есть другие варианты решения, если кто наткнулся на пост и знает, то плиз в комментарии.

Источник

ImageView

Общая информация

Компонент ImageView предназначен для отображения изображений. Находится в разделе Widgets.

Для загрузки изображения в XML-файле используется атрибут android:src, в последнее время чаще используется атрибут app:srcCompat.

ImageView является базовым элементом-контейнером для использования графики. Можно загружать изображения из разных источников, например, из ресурсов программы, контент-провайдеров. В классе ImageView существует несколько методов для загрузки изображений:

  • setImageResource(int resId) — загружает изображение по идентификатору ресурса
  • setImageBitmap(Bitmap bitmap) — загружает растровое изображение
  • setImageDrawable(Drawable drawable) — загружает готовое изображение
  • setImageURI(Uri uri) — загружает изображение по его URI

Метод setImageResource()

Сначала нужно получить ссылку на ImageView, а затем используется идентификатор изображения из ресурсов:

Метод setImageBitmap()

Используется класс BitmapFactory для чтения ресурса изображения в объект Bitmap, а затем в ImageView указывается полученный Bitmap. Могут быть и другие варианты.

Метод setImageDrawable()

Если у вас есть готовое изображение, например, на SD-карте, то его можно использовать в качестве объекта Drawable.

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

Метод setImageURI()

Берётся URI файла изображения и используется в качестве источника изображения. Этот способ годится для работы с локальными изображениями.

Загружаем Drawable через URI.

Другие методы

Также вам часто придется использовать методы, связанные с размерами и масштабированием: setMaxHeight(), setMaxWidth(), getMinimunHeight(), getMinimunWidth(), getScaleType(), setScaleType().

Читайте также:  Телевизор с андроид тв мышь

Масштабирование через свойство Scale Type

Для масштабирования картинки в ImageView есть свойство Scale Type и соответствующий ему атрибут android:scaleType и перечисление ImageView.ScaleType.

  • CENTER
  • CENTER_CROP
  • CENTER_INSIDE
  • FIT_CENTER
  • FIT_START
  • FIT_END
  • FIT_XY
  • MATRIX

Чтобы увидеть разницу между разными режимами, желательно использовать большую картинку, превосходящую по ширине экрана устройства. Допустим, у нас есть простенькая разметка:

Для наглядности я задал красный цвет для фона ImageView.

Режим android:scaleType=»center» выводит картинку в центре без масштабирования. Если у вас будет картинка большего размера, то края могут быть обрезаны.

Режим android:scaleType=»centerCrop» также размещает картинку в центре, но учитывает ширину или высоту контейнера. Режим попытается сделать так, чтобы ширина (или высота) картинки совпала с шириной (или высотой) контейнера, а остальное обрезается.

Режим android:scaleType=»centerInside» масштабирует картинку, сохраняя пропорции. Можно увидеть задний фон контейнера, если его размеры отличаются от размера картинки.

Режим android:scaleType=»fitCenter» (по умолчанию) похож на предыдущий, но может не сохранять пропорции.

Если выбрать режим android:scaleType=»fitStart», то картинка прижимается к левому верхнему углу и таким образом заполняет верхнюю половину контейнера.

Значение android:scaleType=»fitEnd» сместит картинку в нижнюю часть контейнера.

Режим android:scaleType=»fitXY» растягивает/сжимает картинку, чтобы подогнать её к контейнеру. Может получиться вытянутая картинка, поэтому будьте осторожны.

Последний атрибут android:scaleType=»matrix» вывел картинку без изменений в левом верхнем углу с обрезанными краями.

Атрибут android:adjustViewBounds=»true»

При использовании атрибута scaleType=»fitCenter» из предыдущего примера Android вычисляет размеры самой картинки, игнорируя размеры ImageView. В этом случае ваша разметка может «поехать». Атрибут adjustViewBounds заставляет картинку подчиниться размеру компонента-контейнера. В некоторых случаях это может не сработать, например, если у ImageView установлен атрибут layout_width=»0dip». В таком случае поместите ImageView в RelativeLayout или FrameLayout и используйте значение 0dip для этих контейнеров.

Загрузка изображения из галереи

Предположим, у вас есть на экране компонент ImageView, и вы хотите загрузить в него какое-нибудь изображение из галереи по нажатию кнопки:

Намерение ACTION_PICK вызывает отображение галереи всех изображений, хранящихся на телефоне, позволяя выбрать одно изображение. При этом возвращается адрес URI, определяющий местоположение выбранного изображения. Для его получения используется метод getData(). Далее для преобразования URI-адреса в соответствующий экземпляр класса Bitmap используется специальный метод Media.getBitmap(). И у нас появляется возможность установить изображение в ImageView при помощи setImageBitmap().

На самом деле можно поступить ещё проще и использовать метод setImageURI.

Сравните с предыдущим примером — чувствуете разницу? Тем не менее, приходится часто наблюдать подобный избыточный код во многих проектах. Это связано с тем, что метод порой кэширует адрес и не происходит изменений. Рекомендуется использовать инструкцию setImageURI(null) для сброса кэша и повторный вызов метода с нужным Uri.

В последних версиях системных эмуляторов два примера не работают. Проверяйте на реальных устройствах.

Получить размеры ImageView — будьте осторожны

У элемента ImageView есть два метода getWidth() и getHeight(), позволяющие получить его ширину и высоту. Но если вы попробуете вызвать указанные методы сразу в методе onCreate(), то они возвратят нулевые значения. Можно добавить кнопку и вызвать данные методы через нажатие, тогда будут получены правильные результаты. Либо использовать другой метод активности, который наступает позже.

Копирование изображений между ImageView

Если вам надо скопировать изображение из одного ImageView в другой, то можно получить объект Drawable через метод getDrawable() и присвоить ему второму компоненту.

Читайте также:  Как оптимизировать планшет под андроид

Примеры

В моих статьях можно найти примеры использования ImageView.

Источник

Drawable. Фигуры и градиенты

Shape и ShapeDrawable

Фигуры являются подмножеством Drawable-ресурсов.

Данный вид ресурсов на основе класса ShapeDrawable позволяет описывать простые геометрические фигуры, указывая их размеры, фон и контур с помощью тега .

Можно создавать ресурсы фигур на основе стандартных фигур вроде прямоугольника, эллипса, линии. Для использования ресурсов фигур нужно создать в подкаталоге res/drawable XML-файл, в котором будет присутствовать тег , который в свою очередь может содержать дочерние элементы , ,

Имя файла без расширения будет служить идентификатором (ID): R.drawable.filename в Java-коде и @[package:]drawable/filename в XML-файлах.

Элементы фигуры

— отступы. Возможные атрибуты: android:left, android:top, android:right, android:bottom

  • — размеры фигуры. Возможные атрибуты: android:height, android:width
  • — сплошной цвет для фигуры. Возможные атрибуты: android:color
  • — контур фигуры. Возможные атрибуты: android:width, android:color, android:dashGap (расстояние между черточками), android:dashWidth (длина пунктирной черточки)
  • rectangle (Прямоугольник)

    shape_rect.xml — Атрибут android:shape здесь необязателен: rectangle — это значение по умолчанию.

    Пример с градиентным прямоугольником в качестве разделителя

    Создадим файл separator.xml:

    В разметке приложения добавим код:

    У первого разделителя ширина 1dp, у второго — 3dp. Получили красивую полоску.

    У прямоугольников можно скруглить углы при помощи тега corners

    Можно закруглить углы по отдельности:

    oval (Эллипс)

    Другой вариант с пунктиром:

    ring (Кольцо)

    shape_ring.xml — Для кольца имеются дополнительные атрибуты:

    innerRadius Внутренний радиус innerRadiusRatio Отношение между внешним и внутренним радиусами. По умолчанию равно 3 thickness Толщина кольца (т.е. разница между внешним и внутренним радиусами) thicknessRatio Отношение ширины кольца к его толщине. По умолчанию равно 9

    line (Горизонтальная линия)

    shape_line.xml — Линия может быть только горизонтальной

    Градиенты: gradient и GradientDrawable

    Тег gradient (класс GradientDrawable) позволяет создавать сложные градиентные заливки. Каждый градиент описывает плавный переход между двумя или тремя цветами с помощью линейного/радиального алгоритма или же используя метод развертки.

    Тег gradient внутри тега shape. Основные атрибуты: type, startColor (обязателен), endColor (обязателен) и middleColor (необязателен). Также иногда оказывается полезным атрибут centerColor.

    Используя атрибут type, вы можете описать свой градиент:

    linear

    • android:type=»linear» можно опустить, он так и есть по умолчанию. Отображает прямой переход от цвета startColor к цвету endColor под углом, заданным в атрибуте angle.
    • Атрибут android:angle используется только линейным градиентом и должен быть кратным значению 45.

    Дополнительный материал: Android Dev Tip #3 — помните о прозрачности, который может привести к другому результату.

    Также можно задействовать атрибуты centerX и centerY.

    radial

    Интересный эффект получается при использовании множества радиальных градиентов.

    sweep

    Рисует развёрточный градиент с помощью перехода между цветами startColor и endColor вдоль внешнего края фигуры (как правило, кольца).

    Можно использовать атрибуты android:centerX и android:centerY.

    Попробуйте также такой вариант.

    А почему бы не повращать?

    Примеры с shape

    Закругляем уголки у компонентов

    Создадим отдельный файл res/drawable/roundrect.xml и с его помощью скруглим уголки у LinearLayout, ImageView, TextView, EditText:

    В разметке активности пишем следующее:

    Овальный кабинет

    В Белом доме есть Овальный кабинет. Если вам придётся писать приложение для администрации президента США, то все элементы нужно сделать овальными. Создадим файл res/drawable/oval.xml:

    Заменим в предыдущем примере android:background=»@drawable/roundrect» на android:background=»@drawable/oval».

    Источник

    Оцените статью