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

Одним із найбільш поширених джерел ресурсів є файли зображень. Android підтримує такі формати файлів: .png (бажаний), .jpg (допустимий), .gif (не рекомендований). Для графічних файлів у проєкті за замовчуванням створена папка res/drawable. За замовчуванням вона вже містить кілька файлів — пару файлів іконок:

Під час додавання графічних файлів у цю папку для кожного з них Android створює ресурс Drawable. Після цього ми можемо звернутися до ресурсу таким чином у коді Java:

R.drawable.імя_файла

Або у коді XML:

@[ім'я_пакета:]drawable/ім'я_файлу

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

Далі нам буде запропоновано вибрати папку — drawable або drawable-24. Для додавання звичайних файлів зображень оберемо drawable.

Варто врахувати: файл зображення буде додаватися до застосунку, тим самим збільшуючи його розмір. Крім того, великі зображення негативно впливають на продуктивність. Тому краще використовувати невеликі та оптимізовані (стиснені) графічні файли.

Однак, також варто зазначити, що всі файли зображень, які додаються в цю папку, можуть автоматично оптимізуватися за допомогою утиліти aapt під час побудови проєкту. Це дозволяє зменшити розмір файлу без втрати якості.

Під час копіювання файлу буде запропоновано встановити для нього нове ім’я.

Можна змінити назву файлу, а можна залишити так як є. У моєму випадку файл називається dubi2.png. І потім натиснемо на кнопку Refactor. І після цього в папку drawable буде додано обраний нами файл зображення.

Для роботи із зображеннями в Android можна використовувати різні елементи, але безпосередньо для виведення зображень призначений ImageView. Тому змінимо файл activity_main.xml таким чином:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/dubi2"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
     
</androidx.constraintlayout.widget.ConstraintLayout>

У даному випадку для відображення файлу в ImageView у елемента встановлюється атрибут android:src. У його значенні вказується ім’я графічного ресурсу, яке збігається з ім’ям файлу без розширення.

Після цього можна побачити використання зображення:

  • У режимі Preview або дизайнері в Android Studio.
  • При запуску застосунку.
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/назва_файлу" />

Якщо б ми створювали 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, якщо тема не потрібна). У цьому випадку тема для нас не важлива, тому передаємо значення null. Ресурс повертається у вигляді об'єкта Drawable:
Drawable drawable = ResourcesCompat.getDrawable(res, R.drawable.dubi2, null);

Потім, наприклад, можна передати цей ресурс об'єкту ImageView через його метод setImageDrawable():

imageView.setImageDrawable(drawable);