Афоризм
— Почему Вы не сделаете пластическую операцию?
— А толку! Фасад обновишь, а канализация все равно старая!
Фаина Раневская
Последние статьи

 • javax.crypto.Cypher
Cимметричное шифрование и дешифрирование
октябрь 2019
 • Random, Math.random
Генерация случайных чисел
октябрь 2019
 • Компонент JDatePicker
Описание и пример компонента JDatePicker
сентябрь 2019
 • Компонент Tree
Описание и пример дерева Tree библиотеки base-gui
сентябрь 2019
 • Grid с навигатором
Описание и пример Gridp с навигатором
сентябрь 2019
 • Компонент Grid
Описание и пример Grid библиотеки base-gui
август 2019
 • Библиотека base-gui
Описание компонентов библиотеки base-gui
август 2019
 • Оператор SELECT
Использование SQL-оператора SELECT
август 2019
 • Сокеты в Android
Использование сокетов в Android
июль 2019

Фоновое изображение в 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 не «ругалась».

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/earth_portrait"
    tools:context=".MainActivity">
</LinearLayout>

Изменение положения устройства

Для того, чтобы подключиться к событию изменения положения устройства необходимо переписать метод активности 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()
{
    super.onResume();
    setBackgroundImage(orientation);
}

Итак, в листинге были переопределены два метода активности : onConfigurationChanged и onResume. Но, чтобы система вызвала метод onConfigurationChanged, необходимо настроить манифест приложения.

Манифест AndroidManifest.xml

В файле манифеста проекта manifests/AndroidManifest.xml необходимо в описании активности определить атрибут configChanges. Как видно в следующем коде атрибут включает 3 значения (keyboardHidden, orientation, screenSize), разделенных символом «или» '|'. То есть система будет реагировать на 3 события.

<activity android:name=".MainActivity"
    android:configChanges="keyboardHidden|orientation|screenSize">
 . . .
</activity>

Дополнительную информацию по настройкам манифеста приложений с несколькими активностями, а также для взаимодействия разных приложений между собой можно получить на странице описания намерений 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

  Рейтинг@Mail.ru