Главная страница

моб разраб. Лабораторные работы с 1 по 21. Лабораторная работа Использование значений строк и цветов


Скачать 5.49 Mb.
НазваниеЛабораторная работа Использование значений строк и цветов
Анкормоб разраб
Дата05.03.2022
Размер5.49 Mb.
Формат файлаdocx
Имя файлаЛабораторные работы с 1 по 21.docx
ТипЛабораторная работа
#383909
страница6 из 20
1   2   3   4   5   6   7   8   9   ...   20

Ресурсы



Отделение ресурсов от кода программы

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

Приложения Android используют разнообразные ресурсы из внешних (по отношению к коду) файлов, от простых (строки и цвета) до более сложных (изображения, анимации, визуальные стили). Чрезвычайно полезно также отделять от кода такие важные ресурсы, как разметки экранов (Layout), используемые в Активностях. Android автоматически выбирает наиболее подходящие варианты из дерева ресурсов приложения, содержащие разные значения для разных аппаратных конфигураций, языков и регионов, не требуя при этом ни единой строчки кода.
Создание ресурсов

Ресурсы приложения хранятся в каталоге res в дереве каталогов проекта. Плагин ADT автоматически создает каталог res с подкаталогами values, layout и drawable-*, в которых хранятся, соответственно: строковые константы, разметка по умолчанию и иконка приложения для разных плотностей пикселей на экране.

Для девяти главных типов ресурсов используются разные подкаталоги каталога res, это:

    • простые значения

    • изображения

    • разметка

    • анимация

    • стили

    • меню

    • настройки поиска

    • XML

    • «сырые» данные

При сборке пакета .apk эти ресурсы максимально эффективно компилируются и включаются в пакет.

Для работы с ресурсами внутри кода плагин ADT автоматически генерирует файл класса R, содержащий ссылки на все ресурсы. Имена файлов ресурсов могут содержать только латинские буквы в нижнем регистре, подчеркивания и точки.
Простые значения (values)

Android поддерживает следующие типы значений: строки, цвета, размеры и массивы (строковые и целочисленные). Эти данные хранятся в виде XML-файла в каталоге

res/values. Ниже показан пример подобного файла:





To Do List

#FF0000FF

5px



Item 1

Item 2

Item 3





3

2

1




В примере содержатся все доступные типы простых значений, но на самом деле каждый тип ресурсов хранится в отдельном файле, например, res/values/arrays.xml содержит массивы, а res/values/strings.xml – строковые константы.
Строки

Строковые константы определяются с помощью тэга <string>, как показано на примере:

Превед!

Для выделения текста в строках можно использовать HTML-тэги , и . Пример:

Превед, дарлинг!
При необходимости использования данной строки в коде программы используется вышеупомянутый класс R:

String greeting = getString(R.string.greeting_msg);

Цвета

Для описания цветов используется тэг . Значения цвета указываются в шестнадцатеричном виде в одном из следующих форматов:

    • #RGB

    • #ARGB

    • #RRGGBB

    • #AARRGGBB


В примере показаны описания полупрозрачного красного цвета и непрозрачного зеленого:

#77FF0000

#0F0

Лабораторная работа «Использование значений строк и цветов»

  1. В имеющемся проекте HelloAndroidWorld создайте файл colors в каталоге res/values:

File → New → Android XML File:


  1. Отредактируйте содержимое файла res/values/colors.xml:

"1.0"
encoding="utf-8"?>



<color name="view_bkg_color">#FF0</color>

<color name="screen_bkg_color">#F88</color>

<color name="text_color">#8004</color>




  1. Отредактируйте содержимое файла res/values/strings.xml:

"1.0" encoding="utf-8"?>


<string name="hello">Hello, Android World!</string>

<string name="app_name">HelloAndroidWorldstring>


  1. Внесите изменения в файл разметки res/layout/main.xml:

"1.0" encoding="utf-8"?>

"http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"

android:orientation="vertical"

android:background="@color/screen_bkg_color">

android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:background="@color/view_bkg_color" android:textColor="@color/text_color"/>
Сохраните все несохраненные файлы и запустите приложение:


  1. Убедитесь, что внешний вид приложения стал невыносимо мерзким изменился в соответствии с определенными нами ресурсами.

  2. Поэкспериментируйте со значениями цветов, прозрачностью и HTML-тэгами в строковых константах для изменения внешнего вида приложения.


Размеры

Ссылки на размеры чаще всего встречаются внутри ресурсов со стилями и разметкой, например, при указании толщины рамки или величины шрифта. Для описания размеров используется тэг с указанием вида размерности:

    • px – реальные экранные пикселы

    • in – физические дюймы

    • pt – 1/72 дюйма, вычисляется из физического размера экрана

    • mm – физические миллиметры, вычисляется из физического размера экрана

    • dp – «независимые» от плотности экрана пиксели, равны одному пикселю при эталонной плотности 160 dpi; можно также указывать как dip; чаще всего используются для указания размеров рамок и полей

    • sp – «независимые» от масштаба пиксели, аналогичны dp, но учитывают также пользовательские настройки размеров шрифта (крупный, мелкий, средний), поэтому рекомендуются для описания шрифтов

Пример описания «большого» шрифта и «стандартной» рамки:

5dp

16sp


Визуальные стили и темы

Стили и темы позволяют поддерживать единство внешнего вида приложения с помощью атрибутов, используемых Представлениями (View), чаще всего это цвета и шрифты.

Внешний вид приложения легко меняется при изменении стилей (тем оформления) в Манифесте приложения.

Для создания стиля используется тэг




В тэге

e name="SmallText" parent="NormalText">

8sp





Изображения

Ресурсы Drawable содержат растровые изображения. Это могут быть сложные составные ресурсы, такие, как LevelListDrawables и StateListDrawables, описываемые в формате XML, а также растягиваемые растровые изображения NinePatch. Ресурсы Drawable хранятся в каталогах res/drawable-* виде отдельных файлов. Идентификаторами для таких ресурсов служат имена в нижнем регистре (без расширения). Поддерживаются форматы PNG (предпочтительный), JPEG и GIF.
Разметка

Благодаря использованию ресурсов с разметкой (layout) разработчик имеет возможность отделить логику программы от ее внешнего вида. Разметку, определенную в файле формата XML, можно загрузить для использования в Активности методом setContentView, как это реализовано в нашем приложении в методе onCreate:

setContentView(R.layout.main);
Каждый ресурс с разметкой хранится в отдельном файле в каталоге res/layout. Имя файла используется как идентификатор данного ресурса (как обычно, без расширения). При создании нашего учебного приложения мастер создания новых проектов создал для нас файл res/layout/main.xml, который мы уже редактировали:

"1.0"
encoding="utf-8"?>

"http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/screen_bkg_color" android:orientation="vertical" >

android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@color/view_bkg_color" android:text="@string/hello" android:textColor="@color/text_color"/>

Данный файл содержит разметку LinearLayout, которая является контейнером для элемента TextView, отображающее содержимое строки с именем hello, описанную в ресурсе strings.

Анимация

Android поддерживает два вида анимации: пошаговую анимацию, последовательно выводящую на экран изображения с заданной длительностью, и анимацию, основанную на расчете промежуточных кадров, в этом случае применяются различные преобразования – вращения, растягивания, перемещения и затемнения. Все эти трансформации описываются в XML-файле в каталоге res/anim. Пример файла анимации, в котором целевой элемент одновременно поворачивается на 270 градусов, сжимается и постепенно исчезает:






android:fromDegrees="0" android:toDegrees="270" android:pivotX="50%" android:pivotY="50%" android:startOffset="500" android:duration="1000" />

android:fromXScale="1.0" android:toXScale="0.0" android:fromYScale="1.0" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:startOffset="500" android:duration="500" />

android:fromAlpha="1.0" android:toAlpha="0.0" android:startOffset="500" android:duration="500" />

Ресурс , описывающий пошаговую анимацию, хранится в каталоге res/drawable. В следующем примере описана анимация, основанная на последовательном отображении шести изображений поезда, каждое из которых (кроме последнего) отображается в течении 200 миллисекунд. Разумеется, для использования такой анимации нужны ресурсы с изображениями (Drawable), находящимися в этом же каталоге с именами (как вариант, в формате PNG) train1.png .. train6.png.


xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">

/>

/>

/>

/>

/>





Подробную информацию о возможностях анимации в Android можно найти здесь: http://developer.android.com/guide/topics/graphics/animation.html

Меню

Ресурсы меню могут использоваться для описания как главного меню Активности, так и контекстного, появляющегося при длительном нажатии на какой-либо элемент пользовательского интерфейса (разумеется, если это поддерживается и имеет смысл для вашего приложения). Меню, описанное в формате XML, загружается в приложение с помощью метода inflate системного сервиса MenuInflater. Обычно это происходит внутри метода onCreateOptionsMenu (для главного меню) или onCreateContextMenu (для контекстного меню), переопределенных в Активности. Каждый экземпляр меню описывается в отдельном XML-файле в каталоге res/menu. Как обычно, имена файлов (без расширений) становятся именами ресурсов. Ниже приведен пример простого ресурса с меню, имеющего три пункта: Refresh, Settings и Quit:












Каждый из этих пунктов меню имеет уникальный идентификатор (menu_refresh, menu_settings и menu_quit), позволяющий в дальнейшем обработчику меню определить, какой из пунктов был выбран пользователем.

Использование внешних ресурсов в коде приложения

Доступ к ресурсам в коде осуществляется с помощью автоматически генерируемого класса R, точнее, его подклассов. Например, класс R в нашем проект выглядит так:

package com.example.helloandroidworld;
public final class R {

public static final class attr {

}

public static final class color {

public static final int screen_bkg_color=0x7f040001; public static final int text_color=0x7f040002; public static final int view_bkg_color=0x7f040000;

}

public static final class drawable {

public static final int ic_launcher=0x7f020000;

}

public static final class layout {

public static final int main=0x7f030000;

}

public static final class string {

public static final int app_name=0x7f050001;

public static final int hello=0x7f050000;

}

}
Члены классов с именами, соответствующими ресурсам, являются идентификаторами в таблице ресурсов, а не самими экземплярами ресурсов.

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

setContentView(R.layout.main);

Toast.makeText(this, R.string.awesome_error, Toast.LENGTH_LONG).show();
В случае, если необходим экземпляр ресурса, требуется доступ к таблице ресурсов, осуществляемый с помощью экземпляра класса Resources. Этот класс содержит геттеры для всех видов ресурсов, при этом в качестве параметров используются идентификаторы ресурсов из класса R:

// Получаем доступ к таблице ресурсов Resources r = getResources();
// и получаем необходимые экземпляры ресурсов

CharSequence greetingMsg = r.getText(R.string.greeting_message); Drawable icon = r.getDrawable(R.drawable.app_icon);

int opaqueBlue = r.getColor(R.color.opaque_blue);
float borderWidth = r.getDimension(R.dimen.standard_border); String[] stringArray = r.getStringArray(R.array.string_array); int[] intArray = r.getIntArray(R.array.integer_array);

Использование ресурсов внутри ресурсов

Для обращение к одному ресурсу внутри описания другого ресурса используется следующая нотация:

attribute="@[packagename:]resourcetype/resourceidentifier"
Имя пакета используется только при обращении к ресурсам из другого пакета, для обращения к своим ресурсам его указывать не требуется. В нашем случае такую нотацию можно увидеть, например, при описании элемента разметки TextView в файле res/layout/main.xml:


android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@color/view_bkg_color" android:text="@string/hello" android:textColor="@color/text_color"/>
Аналогичным образом осуществляется доступ к системным ресурсам, в качестве имени пакета при этом указывается @android:

<EditText

android:id="@+id/myEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@android:string/ok" android:textColor="@android:color/primary_text_light"/>
Обратите внимание на атрибут android:id="@+id/myEditText". Такая запись позволяет

присвоить идентификатор вашему компоненту ресурса (в данном случае элементу

разметки) и в дальнейшем использовать этот идентификатор для получения экземпляра ресурса.

Ссылки на текущие визуальные стили позволяют использовать действующие в настоящий момент атрибуты стилей, вместо того, чтобы заново их определять. Для указания ссылки на такой ресурс используется символ ? Вместо @:



android:id="@+id/myEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/edit_text_hint" android:backgroundColor="?android:backgroundColor"/>


Локализация приложения с помощью внешних ресурсов

Одно из основных преимуществ использования внешних по отношению к коду приложения ресурсов – возможность использования механизма автоматического выбора ресурсов. Пользуясь описанным ниже механизмом, можно создавать индивидуальные ресурсы для различных аппаратных конфигураций, языков, регионов и т. д. Android во время выполнения приложения сам выберет наиболее подходящие ресурсы.

Для индивидуальной настройки приложения доступны следующие возможности:

    • MCC (Mobile Country Code) и MNC (Mobile Network Code)

    • Язык и регион. Например, en-rUS для английского языка в американском регионе (маленькая r от «region»), ru для русского

    • Размер экрана (small, medium или large)

    • «Широкоформатность» экрана (long или notlong)

    • Ориентация экрана (port, land или square)

    • Плотность пикселей на экране (ldpi, mdpi, hdpi или nodpi)

    • Тип сенсорного экрана (notouch, stylus или finger)

    • Доступность клавиатуры (keysexposed, keyshidden или keyssoft)

    • Тип ввода (nokeys, qwerty или 12key)

    • Способ навигации (nonav, dpad, trackball или wheel )

Альтернативные ресурсы располагаются в подкаталогах каталога res, при этом используются модификаторы стандартных имен подкаталогов с ресурсами. Например, файл, содержащий строковые константы для русского языка, будет располагаться по следующему пути: res/values-ru/strings.xml Модификатором в данном случае является суффикс -ru, добавленный к имени каталога values.

Лабораторная работа «Локализация приложения»

  1. Измените ресурсы приложения HelloAndroidWorld так, чтобы оно выглядело следующим образом (на виртуальном устройстве должен быть установлен английский язык):



  1. Добавьте нужные подкаталоги и ресурсы в каталог res проекта HelloAndroidWorld, чтобы при настройке русского языка приложение меняло свой вид на следующий:



  1. Проделайте те же действия для польского языка:




  1. Восстановите языковые настройки на виртуальном устройстве.


Лабораторная работа «Использование анимации»

  1. Создайте новый проект AnimSample.

  2. В каталоге res создайте каталог anim, а в нем файл с именем ship_anim.xml, описывающий анимацию. Отредактируйте файл, чтобы он имел следующее содержимое:

"1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">

android:duration="3333" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" android:repeatMode="reverse" android:toDegrees="1080" />

android:duration="1900" android:fromXDelta="-50%p" android:repeatCount="infinite" android:repeatMode="reverse" android:toXDelta="50%p" />


android:duration="1300" android:fromYDelta="-50%p" android:repeatCount="infinite" android:repeatMode="reverse" android:startOffset="123" android:toYDelta="50%p" />

android:duration="500" android:fromAlpha="1.0" android:repeatCount="infinite" android:repeatMode="reverse" android:toAlpha="0.3" />

android:duration="10000" android:fromXScale="0.0" android:fromYScale="0.0" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" android:repeatMode="reverse" android:toXScale="2.5" android:toYScale="2.5" />



  1. Добавьте рисунок, к которому будет применяться анимация (файл lander_plain.png), в каталог res/drawable-mdpi.

  2. В файле разметки res/layout/main.xml замените элемент TextView на ImageView со следующими атрибутами:


android:id="@+id/shipView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/lander_plain"/>


  1. В конце метода onCreate Активности (она в этом проекте одна) добавьте следующие строки:

ImageView ship = (ImageView) findViewById(R.id.shipView); Animation shipAnim = AnimationUtils.loadAnimation(this,

R.anim.ship_anim); ship.startAnimation(shipAnim);


  1. Запустите проект.


1   2   3   4   5   6   7   8   9   ...   20


написать администратору сайта