Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Изображения из папки assets



В прошлых темах изображения в проекте помещались в папку res/drawables в качестве ресурсов и выводились в элемент ImageView. Однако изображения необязательно в принципе помещать именно в эту папку. Файлы также могут располагаться в папке assets. Рассмотрим, как работать с такими файлами изображений.

Вначале добавим в проект папку assets. Для этого перейдем в Android Studio к полному определению проекта и добавим в папку main новую папку, которую назовем assets:

Добавим в эту папку какое-нибудь изображение:

Пусть в файле activity_main.xml будет определен элемент ImageView:

<? xml version=" 1.0" encoding=" utf-8"? >

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

android: layout_width=" match_parent"

android: layout_height=" match_parent" >

< ImageView

   android: id=" @+id/image"

   android: layout_width=" match_parent"

   android: layout_height=" match_parent"

   android: padding=" 16dp" />

< /RelativeLayout>

Загрузим изображение из папки assets в элемент ImageView в MainActivity:

package com.example.eugene.imagesapp;

 

import android.graphics.drawable.Drawable;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.ImageView;

 

import java.io.IOException;

import java.io.InputStream;

 

public class MainActivity extends AppCompatActivity {

 

@Override

protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.activity_main);

 

   ImageView imageView = (ImageView) findViewById(R.id.image);

   String filename = " dubi.png";

   InputStream inputStream = null;

   try{

       inputStream = getApplicationContext().getAssets().open(filename);

       Drawable d = Drawable.createFromStream(inputStream, null);

       imageView.setImageDrawable(d);

       imageView.setScaleType(ImageView.ScaleType.FIT_XY);

   }

   catch (IOException e){

       e.printStackTrace();

   }

   finally {

       try{

           if(inputStream! =null)

               inputStream.close();

       }

       catch (IOException ex){

           ex.printStackTrace();

       }

   }

}

}

Для загрузки файла необходиом получить поток InputStream с помощью выражения getApplicationContext().getAssets().open(filename).

Вызов Drawable.createFromStream(inputStream, null) формирует объект Drawable из входного потока.

Метод imageView.setImageDrawable(d) загружает Drawable в ImageView.



Стили и темы

Стили

Мы можем настроить элемент с помощью различных атрибутов, которые задают высоту, ширину, цвет фона, текста и так далее. Но если у нас несколько элементов используют одни и те же настройки, то мы можем объединить эти настройки в стили.

Например, пусть у нас есть несколько элементов TextView:

<? xml version=" 1.0" encoding=" utf-8"? > < LinearLayout xmlns: android=" http: //schemas.android.com/apk/res/android" android: layout_width=" match_parent" android: layout_height=" match_parent" android: orientation=" vertical" > < TextView   android: layout_width=" match_parent"    android: layout_height=" 50dp"    android: gravity=" center"    android: textSize=" 22sp"    android: textColor=" #3f51b5"    android: text=" Android Lollipop" /> < TextView   android: layout_width=" match_parent"    android: layout_height=" 50dp"    android: gravity=" center"    android: textSize=" 22sp"    android: textColor=" #3f51b5"    android: text=" Android Marshmallow" /> < TextView   android: layout_width=" match_parent"    android: layout_height=" 50dp"    android: gravity=" center"    android: textSize=" 22sp"    android: textColor=" #3f51b5"    android: text=" Android Nougat" /> < /LinearLayout>

Все эти TextView имеют одинаковый набор свойств, и, к примеру, если нам захочется изменить цвет текста, то придется менять его у всех трех TextView. Данный подход не оптимален, а более оптимальный подход представляет использование стилей.

По умолчанию при создании проекта в Android Studio в папку res/values уже добавляется файл для стилей styles.xml:

Если такого файла нет, то его можно добавить, либо можно добавить еще один файл стилей. Главное чтобы стили находились в каталоге проекта res/values/ в файле xml. При этом файл может иметь произвольное имя, необязательно styles.xml.

Имеющийся файл styles.xml имеет следующее определение:

< resources> <! -- Base application theme. --> < style name=" AppTheme" parent=" Theme.AppCompat.Light.DarkActionBar" >    <! -- Customize your theme here. -->    < item name=" colorPrimary" > @color/colorPrimary< /item>    < item name=" colorPrimaryDark" > @color/colorPrimaryDark< /item>    < item name=" colorAccent" > @color/colorAccent< /item> < /style> < /resources>

Стиль задается с помощью элемента < style>. Атрибут name указывает на название стиля, через которое потом можно ссылаться на него. Необязательный атрибут parent устанавливает для данного стиля родительский стиль, от которого дочерний стиль будет наследовать все свои характеристики.

С помощью элементов item устанавливаются конкретные свойства виджета, который принимает в качестве значения атрибута name имя устанавливаемого свойства.

Вернемся к нашей задачи по стилизации элементов TextView и для ее решения изменим файл styles.xml:

< resources> <! -- Base application theme. --> < style name=" AppTheme" parent=" Theme.AppCompat.Light.DarkActionBar" >    <! -- Customize your theme here. -->    < item name=" colorPrimary" > @color/colorPrimary< /item>    < item name=" colorPrimaryDark" > @color/colorPrimaryDark< /item>    < item name=" colorAccent" > @color/colorAccent< /item> < /style> < style name=" TextViewStyle" >    < item name=" android: layout_width" > match_parent< /item>    < item name=" android: layout_height" > 50dp< /item>    < item name=" android: textColor" > #3f51b5< /item>    < item name=" android: textSize" > 22sp< /item>    < item name=" android: gravity" > center< /item> < /style> < /resources>

Здесь определен новый стиль TextViewStyle, который с помощью элементов item задает значения для атрибутов TextView.

Теперь применим стиль, изменим файл activity_main.xml:

<? xml version=" 1.0" encoding=" utf-8"? > < LinearLayout xmlns: android=" http: //schemas.android.com/apk/res/android" android: layout_width=" match_parent" android: layout_height=" match_parent" android: orientation=" vertical" > < TextView   style=" @style/TextViewStyle"    android: text=" Android Lollipop" /> < TextView   style=" @style/TextViewStyle"    android: text=" Android Marshmallow" /> < TextView   style=" @style/TextViewStyle"    android: text=" Android Nougat" /> < /LinearLayout>

Используя определение style=" @style/TextView" текстовое поле связывается с определением стиля. Итоговый результат буде тот же, что и раньше, только кода становится меньше. А если мы захотим поменять какие-то характеристики, то достаточно изменить нужный элемент item в определении стиля.



Темы

Кроме применение отдельных стилей к отдельным элементам, мы можем задавать стили для всего приложения или activity в виде тем.

Мы можем сами создать тему. Однако Android уже предоставляет несколько предустановленных тем для стилизации приложения, например, Theme.AppCompat.Light.DarkActionBar и ряд других.

Для определения тем приложения откроем файл AndroidManifest.xml. В нем мы можем увидеть следующее определение элемента application, представляющего приложение:

< application   android: allowBackup=" true"    android: icon=" @mipmap/ic_launcher"    android: label=" @string/app_name"    android: roundIcon=" @mipmap/ic_launcher_round"    android: supportsRtl=" true"    android: theme=" @style/AppTheme" >

Задание темы происходит с помощью атрибута android: theme. В данном случае используется ресурс, определенный в стилях - в файле res/values/styles.xml:

< style name=" AppTheme" parent=" Theme.AppCompat.Light.DarkActionBar" > < item name=" colorPrimary" > @color/colorPrimary< /item> < item name=" colorPrimaryDark" > @color/colorPrimaryDark< /item> < item name=" colorAccent" > @color/colorAccent< /item> < /style>

Стиль AppTheme использует встроенную тему Theme.AppCompat.Light.DarkActionBar, которая придает визуальные характеристики нашему приложению.

Теперь определим стиль, который использует другую тему:

< resources>     < style name=" NoActionBarTheme" parent=" Theme.AppCompat.DayNight.NoActionBar" > < /style>     < style name=" AppTheme" parent=" Theme.AppCompat.Light.DarkActionBar" >    <! -- Customize your theme here. -->    < item name=" colorPrimary" > @color/colorPrimary< /item>    < item name=" colorPrimaryDark" > @color/colorPrimaryDark< /item>    < item name=" colorAccent" > @color/colorAccent< /item> < /style> < style name=" TextViewStyle" >    < item name=" android: layout_width" > match_parent< /item>    < item name=" android: layout_height" > 50dp< /item>    < item name=" android: textColor" > #3f51b5< /item>    < item name=" android: textSize" > 22sp< /item>    < item name=" android: gravity" > center< /item> < /style> < /resources>

Пусть новый стиль называется NoActionBarTheme, который ссылается на тему Theme.AppCompat.DayNight.NoActionBar. Теперь установим его в качестве тему приложения в файле AndroidManifest.xml:

< application android: theme=" @styles/NoActionBarTheme"


Поделиться:



Последнее изменение этой страницы: 2019-05-04; Просмотров: 333; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.019 с.)
Главная | Случайная страница | Обратная связь