android tint что это

Android. Вывод изображений, различные способы

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

Обычный метод – стандартный способ, используя ImageView. Рассмотрены варианты загрузки картинки из ресурса, а также из файла на SD карте устройства.

Продвинутый вариант — вывод изображения, используя WebView. Добавляется поддержка масштабирования и прокрутки картинки при помощи жестов.

“Джедайский” способ – улучшенный предыдущий вариант. Добавлен полноэкранный просмотр с автоматическим масштабированием изображения при показе и поддержкой смены ориентации устройства.

Исходники тестового проекта на GitHub github.com/Voldemar123/andriod-image-habrahabr-example

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

Итак, задача — предположим, в нашем приложении необходимо вывести изображение на экран.
Картинка может размерами превышать разрешение экрана и иметь различное соотношение сторон.
Хранится она либо в ресурсах приложения, либо на External Storage — SD карте.

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

public static final String APP_PREFS_NAME = Constants.class.getPackage().getName();
public static final String APP_CACHE_PATH =
Environment.getExternalStorageDirectory().getAbsolutePath() +
«/Android/data/» + APP_PREFS_NAME + «/cache/»;

Layout, где выводится картинка

Масштабирование по умолчанию, по меньшей стoроне экрана.
В Activity, где загружаем содержимое картинки

private ImageView mImageView;
mImageView = (ImageView) findViewById(R.id.imageView1);

Из ресурсов приложения (файл из res/drawable/img3.jpg)

Задавая Bitmap изображения

FileInputStream fis = new FileInputStream(Constants.APP_CACHE_PATH + this.image);
BufferedInputStream bis = new BufferedInputStream(fis);

Bitmap img = BitmapFactory.decodeStream(bis);

Или передать URI на изображение (может хранится на карте или быть загружено из сети)

mImageView.setImageURI( imageUtil.getImageURI() );
Uri.fromFile( new File( Constants.APP_CACHE_PATH + this.image ) );

Этот способ стандартный, описан во множестве примеров и поэтому нам не особо интересен. Переходим к следующему варианту.

Предположим, мы хотим показать большое изображение (например фотографию), которое размерами превышает разрешение нашего устройства. Необходимо добавить прокрутку и масштабирование картинки на экране.

В Activity, где загружаем содержимое

protected WebView webView;
webView = (WebView) findViewById(R.id.webView1);

установка черного цвета фона для комфортной работы (по умолчанию – белый)

включаем поддержку масштабирования

больше места для нашей картинки

webView.setPadding(0, 0, 0, 0);

полосы прокрутки – внутри изображения, увеличение места для просмотра

загружаем изображение как ссылку на файл хранящийся на карте памяти

webView.loadUrl(imageUtil.getImageFileLink() );
«file:///» + Constants.APP_CACHE_PATH + this.image;

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

В AndroidManifest.xml для нашей Activity добавляем

В код Activity добавлен метод, который вызыватся при каждом повороте нашего устройства.

@Override
public void onConfigurationChanged(Configuration newConfig) <
super.onConfigurationChanged(newConfig);
changeContent();
>

В приватном методе описана логика пересчета масштаба для картинки
Получаем информацию о размерах дисплея. Из-за того, что мы изменили тему Activity, теперь WebView раскрыт на полный экран, никакие другие элементы интерфейса не видны. Видимый размер дисплея равен разрешению экрана нашего Android устройства.

Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

int width = display.getWidth();
int height = display.getHeight();

Размеры изображения, выбранного для показа

Bitmap img = imageUtil.getImageBitmap();

int picWidth = img.getWidth();
int picHeight = img.getHeight();

Меняем масштаб изображения если его высота больше высоты экрана. Прокрутка теперь будет только по горизонтали.

if (picHeight > height)
val = new Double(height) / new Double(picHeight);

Подбрасываем в WebView специально сформированный HTML файл, содержащий изображение.

webView.loadDataWithBaseURL(«/»,
imageUtil.getImageHtml(picWidth, picHeight),
«text/html»,
«UTF-8»,
null);

StringBuffer html = new StringBuffer();

Такой способ я применил из-того, что после загрузки изображения в WebView через метод loadUrl, как в прошлом варианте, setInitialScale после поворота устройства не изменяет масштаб картинки. Другими словами, показали картинку, повернули телефон, масштаб остался старый. Очень похоже на то, что изображение как-то кешируется.

Я не нашел в документации упоминания об этом странном поведении. Может быть местные специалисты скажут, что я делаю не так?

Источник

Как настроить оттенок для просмотра изображений программно в android?

Нужно установить оттенок для представления изображения. Я использую его следующим образом:

Но это не меняется.

ОТВЕТЫ

Ответ 1

Вы можете легко изменить оттенок в коде с помощью:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // Белый оттенок

Если вы хотите цветовой оттенок, то

Для векторного Drawable

Ответ 2

Пользователь @Tad имеет его ответ в правильном направлении, но он работает только с API 21 +.

Чтобы установить оттенок во всех версиях Android, используйте ImageViewCompat :

Ответ 3

Это сработало для меня

Ответ 4

Если эта строка находится в пределах вашей активности:

Кроме того, вам необходимо указать ваше основное действие:

Обратите внимание, что это также относится к другим типам ресурсов, таким как целые числа, bools, измерения и т.д. За исключением строки, для которой вы можете напрямую использовать getString() в своей деятельности без необходимости сначала звонить getResources() (не спрашивайте меня, почему).

В противном случае ваш код выглядит хорошо. (Хотя я не исследовал метод setColorFilter слишком много. )

Ответ 5

После того, как я пробовал все методы, и они не работали для меня.

Я получаю решение с помощью другого PortDuff.MODE.

Ответ 6

Начиная с леденец, есть также Оттенок метод BitmapDrawables, который работает с новым классом Palette:

public void setTintList (оттенок ColorStateList)

public void setTintMode (PorterDuff.Mode tintMode)

В старых версиях Android теперь вы можете использовать библиотеку DrawableCompat

Ответ 7

Попробуй это. Он должен работать на всех версиях Android, поддерживаемых библиотекой поддержки:

Вы можете использовать любой из вышеперечисленных функций, чтобы заставить его работать.

Вы можете прочитать о более интересных особенностей DrawableCompat на документы, здесь.

Ответ 8

Простая и одна строка

Ответ 9

Начиная с Lollipop существует метод, называемый ImageView#setImageTintList() который вы можете использовать. Преимущество состоит в том, что для него требуется ColorStateList а не только один цвет, что делает отображение ColorStateList в соответствии с цветом.

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

Ответ 10

Ответ 11

Поскольку первый ответ не сработал у меня:

Это похоже, похоже, работает в API 21+, но для меня это не проблема. Вы можете использовать ImageViewCompat для решения этой проблемы, tho.

Ответ 12

Если ваш цвет имеет прозрачность шестнадцатеричного цвета, используйте приведенный ниже код.

Чтобы очистить оттенок

Ответ 13

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

Ответ 14

Ответ 15

Как сказал @milosmns, вы должны использовать imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

Для этого API требуется значение цвета вместо идентификатора ресурса цвета. Это основная причина, почему ваш оператор не работает.

Ответ 16

Я опаздываю на вечеринку, но я не видел своего решения выше. Мы также можем установить оттенок цвета с помощью setImageResource() (мой minSdkVersion равен 24).

Итак, во-первых, вам нужно создать селектор и сохранить его в папке ресурсов /drawable (я называю это ic_color_white_green_search.xml )

Затем установите его в коде так:

Ответ 17

Добавление к ADev ответа (что на мой взгляд является наиболее правильным), начиная с широкого распространения Kotlin, и его полезных функций расширения:

Я думаю, что эта функция может быть полезна в любом проекте Android!

Ответ 18

Для установки оттенка для просмотра изображений программно в Android

У меня есть два метода для Android:

Я надеюсь, что я помог никому 🙂

Ответ 19

Лучшая упрощенная функция расширения благодаря ADev

Использование:-

Ответ 20

Если вы хотите установить селектор на ваш оттенок:

Ответ 21

Просто добавьте, если вы хотите удалить существующий оттенок, вы можете установить его в прозрачный цвет:

Ответ 22

Неточный ответ, но более простая альтернатива:

Источник

Android imageview tint

While setting tint for an ImageView in xml, I am getting a warning that shows:-

Must use app:tint instead of android:tint

Why should I use app:tint?

android tint что это

4 Answers 4

Because there were some issues where android:tint wasn’t working for version app:tint works under version 21. Here is a similar problem. Drawable tinting for api

android tint что это

Actually I have not found explanation why should developer replace android:tint with app:tint. My project minSdkVersion is 22.

It looks like this is a bug of Android Studio to me, as it doesn’t take into account your minSdkVersion and also app:tint is not supported well in designer preview. It confuse and slow me repeatedly as I don’t remember stuff like this when going back to android development.

Hopefully one day they will improve it to be really useful and account also your minSdkVersion but for now it look like its best to ignore that by going to preferences editor inspection and disable app:tint attribute should be used on completely.

Edit: Also I discovered that app:tint dont works on some android version so I am quite confused now I had to change all mistakenly set app:tint to android:tint

android tint что это

Not the answer you’re looking for? Browse other questions tagged android or ask your own question.

Linked

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.11.26.40833

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Работа с изображениями

Ресурсы изображений

android tint что это

Например, добавим в проект в папку res/drawable какой-нибудь файл изображения. Для этого скопируем на жестком диске какой-нибудь файл с расширением png или jpg и вставим его в папку res/drawable (для копирования в проект используется простой Copy-Paste)

android tint что это

Здесь сразу стоит учесть, что файл изображения будет добавляться в приложение, тем самым увеличивая его размер. Кроме того, большие изображения отрицательно влияют на производительность. Поэтому лучше использовать небольшие и оптимизрованные (сжатые) графические файлы. Хотя, также стоит отметить, что все файлы изображений, которые добавляются в эту папку, могут автоматически оптимизироваться с помощью утилиты aapt во время построения проекта. Это позволяет уменьшить размер файла без потери качества.

При копировании файла нам будет предложено установить для него новое имя.

android tint что это

android tint что это

android tint что это

Если бы мы создавали ImageView в коде java и из кода применяли бы ресурс, то activity могла бы выглядеть так:

Однако может возникнуть необходимость как-то обработать ресурс перед использованием или использовать его в других сценариях. В этом случае мы можем сначала получить его как объект Drawable и затем использовать для наших задач:

Затем, например, можно также передать ресурс объекту ImageView через его метод setImageDrawable()

Источник

ImageView

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

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

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

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

Метод 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.

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

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

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

android tint что это

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

android tint что это

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

android tint что это

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

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

android tint что это

Значение 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.

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

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

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

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

Примеры

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *