Как добавить изображение в 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,667 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.4k 86 86 золотых знаков 267 267 серебряных знаков 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.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы 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.
Как добавить картинку не теряя качество в android studio?
Проблема заключается в том что делаю проект через макет в фигме Стоит скачать некоторые картинки и выставить размеры согласно размеру проекта качество теряется, в некоторых случаях даже видны квадратики. Как можно решить данную проблему Заранее спасибо )
- Вопрос задан 05 авг. 2023
- 43 просмотра
1 комментарий
Простой 1 комментарий

выставить размеры согласно размеру проекта
что это значит? если у меня проект 20гб то какая картинка должна быть?
в некоторых случаях даже видны квадратики
в каких случаях?
вы в курсе что такое плотность пикселей?
Решения вопроса 0
Ответы на вопрос 1
Сергей Водаков @WaterSmith
Android-разработчик. Java, Kotlin
В идеале нужно использовать векторную графику, но если это не возможно, то под каждое разрашение экрана нужно иметь картинку своего размера, в ресурсах такие картинки лежат в разных папках drawable-hdpi, drawable-mdpi, drawable-xhdpi, drawable-xxhdpi но с одним и тем же именем файла.
Ответ написан 06 авг. 2023
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Android
- +1 ещё
Как корректно реализовать Базу данных в приложении на Андроид?
- 1 подписчик
- 5 часов назад
- 16 просмотров
Фоновое изображение в Layout
Android позволяет устанавливать фоновое (background) изображение в корневой элемент разметки интерфейса Layout. Реализовать это совсем просто; достаточно в описание разметки вставить соответствующий атрибут android:background=»@drawable/earth». Предполагается, что изображение earth хранится в директории проекта res/drawable. На следующем скриншоте представлено изображение земли earth.png, которое будет использовано в описанном ниже примере в качестве фонового изображения разметки интерфейса Layout.

В чем особенность данного фонового изображения? Прямоугольный размер картинки включает расположенное не по центру изображение земли, которое при смене ориентации (orientation) будет «сплющиваться». Все правильные фигуры изображения будут изменять геометрические размеры, поскольку android будет непропорционально растягивать или сжимать фоновое изображения. На следующем скриншоте представлено данное фоновое изображение при повороте устройства android в положение portrait.

В этой статье рассмотрим вопросы размещения и адаптации фонового изображения в разметке интерфейса в зависимости от ориентации устройства. Нам необходимо будет научиться перехватывать обработку события при изменении положения устройства, и устанавливать соответствующее его ориентации фоновое изображение разметки.
Рассмотрим пример использования фонового изображения в разметке интерфейса. Нам необходимо :
- определить фоновое изображение в разметке интерфейса;
- подключиться к событию изменения положения/ориентации устройства;
- определить фоновое изображение согласно положению/ориентации устройства.
Создайте новый модуль Module приложения и разместите два изображения (earth_portrait.png, earth_landscape.png) в директории проекта res/drawable. Правильнее было бы, конечно, создать несколько изображений под разные разрешения, о чем сказано в описании ImageView. Но, для решения текущей задачи обойдемся «малой кровью», т.е. двумя изображениями. Изображения можно скачать в конце статьи.
Разметка интерфейса
В файле описания интерфейса приложения res/layout/activity.xml определяем два атрибута : background и orientation. В атрибуте android:background определяем ресурсный файл одного из изображениий. Атрибут android:orientation добавляем в описание разметки LinearLayout, чтобы среда разработки Android Studio не «ругалась».
Изменение положения устройства
Для того, чтобы подключиться к событию изменения положения устройства необходимо переписать метод активности onConfigurationChanged и соответствующим образом определить атрибут configChanges в файле манифеста проекта, чтобы система вызывала этот метод.
Метод onConfigurationChanged
Метод активности onConfigurationChanged в качестве параметра получает значение конфигурации устройства, которое передается родительскому (super) методу. Новое положение устройства сохраняем в переменной orientation и после этого вызываем метод определения фонового изображения setBackgroundImage.
Для чего нам необходима переменная orientation? Давайте представим ситуацию, что в приложении несколько активностей. В одной из активностей положение устройства изменяется, и после этого открывается данная активность. Система вызовет представленный (переопределенный в листинге) метод onResume, в котором будет определяться соответствующее фоновое изображение вызовом метода setBackgroundImage.
private int orientation; . . . @Override public void onConfigurationChanged(Configuration newConfig) < super.onConfigurationChanged(newConfig); orientation = newConfig.orientation; setBackgroundImage(newConfig.orientation); >private void setBackgroundImage(final int orientation) < LinearLayout layout; layout = (LinearLayout) findViewById(R.id.mainlayout); if (orientation == Configuration.ORIENTATION_LANDSCAPE) layout.setBackgroundResource(R.drawable.earth_landscape); else if (orientation == Configuration.ORIENTATION_PORTRAIT) linear.setBackgroundResource(R.drawable.earth_portrait); >@Override public void onResume()
Итак, в листинге были переопределены два метода активности : onConfigurationChanged и onResume. Но, чтобы система вызвала метод onConfigurationChanged, необходимо настроить манифест приложения.
Манифест AndroidManifest.xml
В файле манифеста проекта manifests/AndroidManifest.xml необходимо в описании активности определить атрибут configChanges. Как видно в следующем коде атрибут включает 3 значения (keyboardHidden, orientation, screenSize), разделенных символом «или» ‘|’. То есть система будет реагировать на 3 события.
Дополнительную информацию по настройкам манифеста приложений с несколькими активностями, а также для взаимодействия разных приложений между собой можно получить на странице описания намерений Intent.
Активность приложения MainActivity
В активности приложения только определяется первоначальное значение переменной orientation. В листинг не включены представленные выше методы.
import android.os.Bundle; import android.app.Activity; import android.widget.LinearLayout; import android.content.res.Configuration; public class MainActivity extends Activity < private int orientation; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom); orientation = Configuration.ORIENTATION_PORTRAIT; >>
После старта приложения можно изменять положение устройства с portrait на landscape и обратно. Переопределенные в активности методы будут корректно устанавливать соответствующие фоновые изображения.
Положение portrait

Положение landscape

Скачать изображения
Используемые в примере изображения можно скачать здесь (742 Kб).
Как добавить изображение в 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,667 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.4k 86 86 золотых знаков 267 267 серебряных знаков 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.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130
Нажимая «Принять все файлы 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.
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, а затем используется идентификатор изображения из ресурсов:
ImageView imageView = findViewById(R.id.imageView); imageView.setImageResource(R.drawable.cat);
Метод setImageBitmap()
Используется класс BitmapFactory для чтения ресурса изображения в объект Bitmap, а затем в ImageView указывается полученный Bitmap. Могут быть и другие варианты.
ImageView imageView = findViewById(R.id.imageView); imageView.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.cat)); // Kotlin val bitmap: Bitmap = (ResourcesCompat.getDrawable( resources,R.drawable.sleepbedcat,null) as BitmapDrawable).bitmap imageView.setImageBitmap(bitmap)
Метод setImageDrawable()
Если у вас есть готовое изображение, например, на SD-карте, то его можно использовать в качестве объекта Drawable.
ImageView imageView = findViewById(R.id.imageView); // плохой код, только для демонстрации imageView.setImageDrawable(Drawable.createFromPath("/mnt/sdcard/cat.jpg"));
Drawable можно получить и из ресурсов, хотя такой код выглядит избыточным, если можно сразу вызвать setImageResource().
// Kotlin val imageView: ImageView = findViewById(R.id.imageView) imageView.setImageDrawable( ContextCompat.getDrawable(this, R.drawable.cat) )
Метод setImageURI()
Берётся URI файла изображения и используется в качестве источника изображения. Этот способ годится для работы с локальными изображениями.
ImageView imageView = findViewById(R.id.imageView); imageView.setImageURI(URI.parse("file://mnt/sdcard/cat.jpg"));
Загружаем Drawable через URI.
// Kotlin val imageView: ImageView = findViewById(R.id.imageView) val button: Button = findViewById(R.id.button) button.setOnClickListener < val uri: Uri = Uri.parse("android.resource://$packageName/$") // remove previous image uri cache imageView.setImageURI(null) // set image view image from uri imageView.setImageURI(uri) // show the uri in text view textView.text = uri.toString() >
Другие методы
Также вам часто придется использовать методы, связанные с размерами и масштабированием: 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, и вы хотите загрузить в него какое-нибудь изображение из галереи по нажатию кнопки:
static final int GALLERY_REQUEST = 1; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, GALLERY_REQUEST); >>); > @Override protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) < super.onActivityResult(requestCode, resultCode, imageReturnedIntent); Bitmap bitmap = null; ImageView imageView = (ImageView) findViewById(R.id.imageView); switch(requestCode) < case GALLERY_REQUEST: if(resultCode == RESULT_OK)< Uri selectedImage = imageReturnedIntent.getData(); try < bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage); >catch (IOException e) < e.printStackTrace(); >imageView.setImageBitmap(bitmap); > > >
Намерение ACTION_PICK вызывает отображение галереи всех изображений, хранящихся на телефоне, позволяя выбрать одно изображение. При этом возвращается адрес URI, определяющий местоположение выбранного изображения. Для его получения используется метод getData(). Далее для преобразования URI-адреса в соответствующий экземпляр класса Bitmap используется специальный метод Media.getBitmap(). И у нас появляется возможность установить изображение в ImageView при помощи setImageBitmap().
На самом деле можно поступить ещё проще и использовать метод setImageURI.
Uri selectedImage = imageReturnedIntent.getData(); imageView.setImageURI(selectedImage);
Сравните с предыдущим примером — чувствуете разницу? Тем не менее, приходится часто наблюдать подобный избыточный код во многих проектах. Это связано с тем, что метод порой кэширует адрес и не происходит изменений. Рекомендуется использовать инструкцию setImageURI(null) для сброса кэша и повторный вызов метода с нужным Uri.
В последних версиях системных эмуляторов два примера не работают. Проверяйте на реальных устройствах.
Получить размеры ImageView — будьте осторожны
У элемента ImageView есть два метода getWidth() и getHeight(), позволяющие получить его ширину и высоту. Но если вы попробуете вызвать указанные методы сразу в методе onCreate(), то они возвратят нулевые значения. Можно добавить кнопку и вызвать данные методы через нажатие, тогда будут получены правильные результаты. Либо использовать другой метод активности, который наступает позже.
@Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ImageView imageView = findViewById(R.id.imageView); final TextView infoTextView = findViewById(R.id.textView); // пробуем получить размеры ImageView сразу при загрузке. Вернёт нулевые значения infoTextView.setText("Размеры ImageView: " + String.valueOf(imageView.getWidth()) + " : " + String.valueOf(imageView.getHeight())); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < // этот же код вызывается при нажатии кнопки. Теперь всё правильно infoTextView.setText("Размеры ImageView: " + String.valueOf(imageView.getWidth()) + " : " + String.valueOf(imageView.getHeight())); >>); >
Копирование изображений между ImageView
Если вам надо скопировать изображение из одного ImageView в другой, то можно получить объект Drawable через метод getDrawable() и присвоить ему второму компоненту.
ImageView ivSource = findViewById(R.id.sourceImageView); // 1-й компонент с какой-то картинкой ImageView ivTarget = findViewById(R.id.targetImageView); // 2-й компонент без картинки Drawable drawable = ivSource.getDrawable(); // получим картинку у первого компонента ivTarget.setImageDrawable(drawable); // присвоим второму
Примеры
В моих статьях можно найти примеры использования ImageView.
Библиотеки
CustomShapeImageView — позволяет создавать рамки разных форм.
MikeOrtiz/TouchImageView — расширенный вариант ImageView, который поддерживает касания экрана и масштабирование.
CircleImageView — компонент для создания круглых аватаров. Другая библиотека с похожим названием Pkmmte/CircularImageView. И ещё одна библиотека vinc3m1/RoundedImageView, позволяющая создавать не только круглые изображения, но и овальные и прямоугольные с закруглёнными углами. Сравнивайте. А также упрощённый компонент pavlospt/CircleView, который позволяет создавать круглый элемент с заголовком и подзаголовком.
Как добавить картинку не теряя качество в android studio?
Проблема заключается в том что делаю проект через макет в фигме Стоит скачать некоторые картинки и выставить размеры согласно размеру проекта качество теряется, в некоторых случаях даже видны квадратики. Как можно решить данную проблему Заранее спасибо )
- Вопрос задан 05 авг. 2023
- 43 просмотра
1 комментарий
Простой 1 комментарий

выставить размеры согласно размеру проекта
что это значит? если у меня проект 20гб то какая картинка должна быть?
в некоторых случаях даже видны квадратики
в каких случаях?
вы в курсе что такое плотность пикселей?
Решения вопроса 0
Ответы на вопрос 1
Сергей Водаков @WaterSmith
Android-разработчик. Java, Kotlin
В идеале нужно использовать векторную графику, но если это не возможно, то под каждое разрашение экрана нужно иметь картинку своего размера, в ресурсах такие картинки лежат в разных папках drawable-hdpi, drawable-mdpi, drawable-xhdpi, drawable-xxhdpi но с одним и тем же именем файла.
Ответ написан 06 авг. 2023
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Android
- +1 ещё
Как корректно реализовать Базу данных в приложении на Андроид?
- 1 подписчик
- 10 часов назад
- 27 просмотров