Работа с изображениями
Одним из наиболее распространенных источников ресурсов являются файлы изображений. Android поддерживает следующие форматы файлов: .png (предпочтителен), .jpg (приемлем), .gif (нежелателен). Для графических файлов в проекте уже по умолчанию создана папка res/drawable . По умолчанию она уже содержит ряд файлов — пару файлов иконок:
При добавлении графических файлов в эту папку для каждого из них Android создает ресурс Drawable . После этого мы можем обратиться к ресурсу следующим образом в коде Java:
R.drawable.имя_файла
@[имя_пакета:]drawable/имя_файла
Например, добавим в проект в папку res/drawable какой-нибудь файл изображения. Для этого скопируем на жестком диске какой-нибудь файл с расширением png или jpg и вставим его в папку res/drawable (для копирования в проект используется простой Copy-Paste)
Далее нам будет предложено выбрать папку — drawable или drawable-24 . Для добавления обычных файлов изображений выберем drawable :
Здесь сразу стоит учесть, что файл изображения будет добавляться в приложение, тем самым увеличивая его размер. Кроме того, большие изображения отрицательно влияют на производительность. Поэтому лучше использовать небольшие и оптимизрованные (сжатые) графические файлы. Хотя, также стоит отметить, что все файлы изображений, которые добавляются в эту папку, могут автоматически оптимизироваться с помощью утилиты aapt во время построения проекта. Это позволяет уменьшить размер файла без потери качества.
При копировании файла нам будет предложено установить для него новое имя.
Можно изменить название файла, а можно оставить так как есть. В моем случае файл называется dubi2.png . И затем нажмем на кнопку Refactor. И после этого в папку drawable будет добавлен выбранный нами файл изображения.
Для работы с изображениями в Android можно использовать различные элементы, но непосредственно для вывода изображений предназначен ImageView . Поэтому изменим файл activity_main.xml следующим образом:
В данном случае для отображения файла в ImageView у элемента устанавливается атрибут android:src . В его значении указывается имя графического ресурса, которое совпадает с именем файла без расширения. И после этого уже в Preview или в режиме дизайнере в Android Studio можно будет увидеть применение изображения, либо при запуске приложения:
Если бы мы создавали ImageView в коде java и из кода применяли бы ресурс, то activity могла бы выглядеть так:
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import android.os.Bundle; import android.widget.ImageView; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); ConstraintLayout constraintLayout = new ConstraintLayout(this); ImageView imageView = new ImageView(this); // применяем ресурс imageView.setImageResource(R.drawable.dubi2); ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams (ConstraintLayout.LayoutParams.WRAP_CONTENT , ConstraintLayout.LayoutParams.WRAP_CONTENT); layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID; layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID; imageView.setLayoutParams(layoutParams); constraintLayout.addView(imageView); setContentView(constraintLayout); >>
В данном случае ресурс drawable напрямую передается в метод imageView.setImageResource() , и таким образом устанавливается изображение. В результате мы получим тот же результат.
imageView.setImageResource(R.drawable.dubi2);
Однако может возникнуть необходимость как-то обработать ресурс перед использованием или использовать его в других сценариях. В этом случае мы можем сначала получить его как объект Drawable и затем использовать для наших задач:
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.res.ResourcesCompat; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.widget.ImageView; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); ConstraintLayout constraintLayout = new ConstraintLayout(this); ImageView imageView = new ImageView(this); Resources res = getResources(); Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.dubi2, null); // применяем ресурс imageView.setImageDrawable(drawable); ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams (ConstraintLayout.LayoutParams.WRAP_CONTENT , ConstraintLayout.LayoutParams.WRAP_CONTENT); layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID; layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID; imageView.setLayoutParams(layoutParams); constraintLayout.addView(imageView); setContentView(constraintLayout); >>
Для получения ресурса применяется метод ResourcesCompat.getDrawable() , в который передается объект Resources, идентификатор ресурса и тема. В данном случае тема нам не важна, поэтому для нее передаем значение null. Возвращается ресурс в виде объекта Drawable :
Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.dubi2, null);
Затем, например, можно также передать ресурс объекту ImageView через его метод setImageDrawable()
imageView.setImageDrawable(drawable);
Как добавить изображение в Android-приложение?
Пишу первую программку для Android (Java). Хочу сделать ImageView с картинкой из ресурсов (через imageView.setImageResource(value)). Положил картинку в res/drawable. В коде еще не использовал. При компиляции странная ошибка:
res\drawable\fish.png: Invalid file name: must contain only [a-z0-9_.]
Отслеживать
задан 9 авг 2011 в 16:40
8,657 18 18 золотых знаков 73 73 серебряных знака 181 181 бронзовый знак
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Попробуйте сделать в Eclipse Clean проекта и проверьте названия файлов ваших ресурсов. Подобная ошибка встречается, когда есть в названиях символы отличные от латиницы и цифр, например русские.
Отслеживать
ответ дан 9 авг 2011 в 16:59
5,707 19 19 серебряных знаков 30 30 бронзовых знаков
Похоже, глюк.
9 авг 2011 в 17:22
Вы скорее всего указываете путь не верно. Должно быть так:
imageView.setImageResource(R.drawable.fish);
Отслеживать
51.2k 86 86 золотых знаков 266 266 серебряных знаков 505 505 бронзовых знаков
ответ дан 9 авг 2011 в 17:22
AndroidDev AndroidDev
1,684 2 2 золотых знака 28 28 серебряных знаков 58 58 бронзовых знаков
Не, оказалось, действительно глюк. Rebuild помог. В коде я даже не написал еще эту строку (использование ресурса).
9 авг 2011 в 17:28
Возможно он с большими буквами и надо сделать их в расширений png
Отслеживать
ответ дан 13 фев 2015 в 14:31
- android
- java
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Android Studio: Добавить свою картинку как иконку проекта
Любое приложение, любой проект, требует своё собственное оформление, свой стиль. И конечно же мобильные приложения не стали исключением. Первый же вопрос, с которым я столкнулся – «Как добавить своё изображение в качестве иконки проекта Android Studio?». Вы можете пользоваться картинками «по умолчанию», что предоставляет программа, но во-первых – этого недостаточно, а во-вторых, часто приходится создавать приложение отталкиваясь от уже существующего брендбука.
Для того чтобы добавить своё изображение в проект, в программе Android Studio, в каталоге Вашего проекта, найдите путь: app > src > res и вызовите контекстное меню (правой кнопкой мыши):
Здесь, как можно увидеть на скриншоте, мы выбираем: New > Image Asset. И попадаем во вкладку, где необходимо указать путь к изображению, задать ему имя и выбрать тип (в нашем случае Image):
Изображение, это файл с расширением *.png, с разрешением 512х512 точек. Для примера, я взял png с разрешением 256х256, чтобы можно было почувствовать разницу. После чего нажимаем Next.
После чего мы видим сообщение о том, что будет заменено текущее изображение загрузчика.
Кстати текущее изображение, можно загрузить и на рабочую область.
Здесь как раз отчётливо видна разница между изображениями 256х256 и 512х512. И кстати, если Вам необходимо добавить изображение для Вашего проекта, то выбрав New > Image Asset, укажите панель Action Bar and Tab Icons.
ImageButton (Кнопка-изображение)
Компонент ImageButton представляет собой кнопку с изображением (вместо текста). По умолчанию ImageButton похож на обычную кнопку.
В режиме дизайна изображение на кнопке определяется атрибутом android:src
Можно сделать двойной щелчок, чтобы сразу установить нужное свойство.
Методы
Программно можно установить изображения через различные методы.
setImageBitmap() Используется, чтобы указать в качестве изображения существующий экземпляр класса Bitmap setImageDrawable() Используется, чтобы указать в качестве изображения существующий экземпляр класса Drawable setImageResource() Используется, чтобы указать в качестве изображения существующий идентификатор ресурса (см. пример) setImageURI() Используется, чтобы указать в качестве изображения существующий адрес типа Uri. В некоторых случаях элемент кэширует изображение и после изменения изображения по прежнему выводит старую версию. Рекомендуется использовать инструкцию setImageURI(null) для сброса кэша и повторный вызов метода с нужным Uri
Примеры
С помощью метода setImageURI() можно обратиться к ресурсу типа Drawable по его идентификатору:
android.resource://[пакет]/[идентификатор ресурса]
Например, можно задать путь Uri:
Uri uri = Uri.parse("android.resource://ru.alexanderklimov.imagebuttondemo/" + R.drawable.cat);
Можно обратиться к ресурсу по его типу/имени:
android.resource://[пакет]/[тип ресурса]/[имя ресурса]
В этом случае код будет следующим:
Uri uri = Uri.parse("android.resource://ru.alexanderklimov.imagebuttondemo/drawable/cat"); imageButton.setImageUri(uri);
Щелчок
Как и у обычной кнопки, интерес представляет только щелчок. В нашем примере мы будем менять поочередно картинки на кнопке (нужно подготовить две картинки в папке drawable)
. ImageButton imageButton; boolean flag = true; imageButton.setOnClickListener(new View.OnClickListener() < public void onClick(View v) < // меняем изображение на кнопке if (flag) imageButton.setImageResource(R.drawable.cutecat4); else // возвращаем первую картинку imageButton.setImageResource(R.drawable.cutecat2); flag = !flag; >>);
Теперь при каждом щелчке изображение на кнопке будет циклически переключаться между двумя картинками.
Продолжительное нажатие
Кроме обычного щелчка, в Android есть особый вид нажатия на кнопку — продолжительное нажатие. Это событие происходит, когда пользователь нажимает и удерживает кнопку в течение одной секунды. Этот тип нажатия обрабатывается независимо от обычного щелчка.
Для обработки продолжительного нажатия нужно реализовать класс View.OnLongClickListener и передать его в метод setOnLongClickListener(). Класс OnLongClickListener имеет один обязательный метод OnLongClick(). В принципе это похоже на метод OnClick(), только имеет возвращаемое значение.
imageButton.setOnLongClickListener(new OnLongClickListener() < @Override public boolean onLongClick(View v) < Toast toast = Toast.makeText(getApplicationContext(), "Long Click", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); return false; >>);
Запустите проект и убедитесь, что при быстром нажатии ничего не происходит, а при более продолжительном нажатии всплывает сообщение.