Стандартный калькулятор — Часть 2. Интерфейс

Автор: Андрей. Категория: Уроки Flex

Flex-приложение "Стандартный калькулятор" Интерфейс

Создадим новый проект Flex «Calculator», где укажем тип — Web-приложение. Реализацию пользовательского интерфейса начнём с создания двух дополнительный классов. Это будут MXML-компоненты на основе класса s:Button. Какие кнопки нажимать, чтобы создать новый MXML-компонент, я подробно рассказал в этом уроке. В этом и последующих уроках я не буду заострять внимание на том, что уже пройдено, а только буду давать пояснения новым вещам.

Разработка профессиональных приложений практически невозможна или по крайней мере весьма неудобна без использования пакетов (packages). Подробное описание понятия пакета несложно найти в интернете. Вкратце — это папка на физическом диске, в которую помещаются однотипные файлы классов. Пакеты также помогают контролировать видимость классов и методов. Мы будем хранить наши новые классы элементов управления в новом пакете controls. Для этого нужно щёлкнуть правой кнопкой мыши по узлу src в Проводнике пакетов и выбрать в выпадающем меню Создать -> Пакет. В поле Имя введём наименование пакета controls и нажмём кнопку Готово. Теперь в Проводнике пакетов ниже пакета по-умолчанию появился наш новый пакет.

Далее в пакете controls создадим 2 MXML-компонента. На начальном этапе они будут различаться только наименованием. Эти компоненты построены на основе s:Button и называются CalcButton.mxml и NumberButton.mxml. Код этих классов приведён ниже:

<?xml version="1.0" encoding="utf-8"?>
<s:Button xmlns:fx="http://ns.adobe.com/mxml/2009" 
	  xmlns:s="library://ns.adobe.com/flex/spark" 
          xmlns:mx="library://ns.adobe.com/flex/mx"
          width="50" height="40">
</s:Button>

Первый контейнер, который мы используем, будет <s:Panel>. Обычно я использую этот элемент управления для создания всплывающих окон, но т.к. это неплохой визуальный компонент, он вполне подходит для оформления нашего калькулятора. Внутри этого контейнера мы скомбинируем контейнеры <s:HGroup> и <s:VGroup>, чтобы упорядоченно выстроить кнопки калькулятора. Кнопка [+] будет самая большая и будет занимать 2 смежных квадрата. Комбинирование элементов <s:HGroup> и <s:VGroup> немного напоминает комбинирование таблиц HTML со смежными ячейками. Напомню, что <s:HGroup> упорядочивает элементы по-горизонтали, а <s:VGroup> — по-вертикали. Расстояние между элементами в этих контейнерах фиксированное и контролируется свойством gap. Но в нашем примере я хочу показать, что можно варьировать расстояние между отдельными элементами, используя элемент <s:Spacer>.

Далее, нужно расположить кнопки (наши новые классы) в необходимом порядке, проставить им идентификаторы и свойства label. Особый интерес вызывают кнопки с нестандартными символами, такими как знаки умножение, деления, квадратного корня и т.п. В этом случае можно использовать коды мнемоник HTML или символы Unicode. На этом этапе приведу пример кода.

<s:Panel left="10" top="10" width="320" height="325" title="Калькулятор">
    <s:VGroup left="10" top="10">
        <s:HGroup width="296">
            <s:TextInput id="mem" width="40" height="40" enabled="false" textAlign="center"/>
            <s:TextInput id="out" width="251" height="40" enabled="false" text="{numberFormatter.format(out.text)}"/>    
        </s:HGroup>
        <s:HGroup>
            <controls:CalcButton id="bMR" label="MR"/>
            <s:Spacer width="5"/>
            <controls:CalcButton id="bMC" label="MC"/>
            <controls:CalcButton id="bMinus" label="M-"/>
            <controls:CalcButton id="bPlus" label="M+"/>
            <s:Spacer width="5"/>
            <controls:CalcButton id="bMul" label="\u00D7"/>
        </s:HGroup>
        <s:HGroup>
            <controls:CalcButton id="bBackspace" label="−/+"/>
            <s:Spacer width="5"/>
            <controls:NumberButton id="b7" label="7"/>
            <controls:NumberButton id="b8" label="8"/>
            <controls:NumberButton id="b9" label="9"/>
            <s:Spacer width="5"/>
            <controls:CalcButton id="bDiv" label="\u00F7"/>
        </s:HGroup>
        <s:HGroup>
            <controls:CalcButton id="bSquare" label="√"/>
            <s:Spacer width="5"/>
            <controls:NumberButton id="b4" label="4"/>
            <controls:NumberButton id="b5" label="5"/>
            <controls:NumberButton id="b6" label="6"/>
            <s:Spacer width="5"/>
            <controls:CalcButton id="bSub" label="−"/>
        </s:HGroup>
        <s:HGroup>
            <s:VGroup width="230">
                <s:HGroup>
                    <controls:CalcButton id="bPersent" label="%"/>
                    <s:Spacer width="5"/>
                    <controls:NumberButton id="b1" label="1"/>
                    <controls:NumberButton id="b2" label="2"/>
                    <controls:NumberButton id="b3" label="3"/>
                </s:HGroup>
                <s:HGroup>
                    <controls:CalcButton id="bC" label="C"/>
                    <s:Spacer width="5"/>
                    <controls:NumberButton id="b0" label="0"/>
                    <controls:CalcButton id="bDot" label="."/>
                    <controls:CalcButton id="bResult" label="="/>
                </s:HGroup>
            </s:VGroup>
            <s:Spacer width="5"/>
            <s:VGroup width="50">
                <controls:CalcButton id="bSum" label="+" height="86"/>        
            </s:VGroup>
        </s:HGroup>            
    </s:VGroup>
</s:Panel>

Ничего сложного в этом коде нет. У каждой кнопки есть свой id и label, а у остальных элементов проставлены свойства width и height. Некоторые label прописаны в виде: «\uХХХХ» Это и есть символ Unicode. На форме отобразиться необходимый нам символ, если мы подставили код правильно.
У элемента <s:Spacer> описано только одно свойство width. Это невидимый элемент, который выполняет функцию отступа между другими элементами в приложении.
Если нажать кнопку Выполнить, запуститься браузер с нашим приложением в таком виде:

Первоначальный вид приложения "Калькулятор"

Весьма неплохо… Давайте теперь немного изменим оформление нашего приложения. Это можно сделать несколькими способами. Например, программное или графическое скинирование с использованием CSS или без использования. Не нужно пугаться незнакомых слов, т.к. для понимания это легко. Вместо стандартных изображений частей элементов управления подставляются либо нарисованные с помощью кода, либо загруженные графические файлы. А указание на новые изображения прописываются либо в основном коде, либо выносятся в файл CSS, что мы сейчас и сделаем. Создадим файл CSS Файл -> Создать -> Файл CSS и назовём его styles.css. Пакет оставим по-умолчанию. В созданном файле добавим одну строчку:

/* CSS file */
@namespace s "library://ns.adobe.com/flex/spark";
@namespace mx "library://ns.adobe.com/flex/mx";
@namespace controls "controls.*";

Для начала добавим свойства для абсолютно всех элементов управления через блок global.

/* CSS file */
@namespace s "library://ns.adobe.com/flex/spark";
@namespace mx "library://ns.adobe.com/flex/mx";
@namespace controls "controls.*";

global
{
    color: #FFFFFF;
    chromeColor: #677a94;
    fontFamily: Arial;
}

Чтобы увидеть изменения необходимо связать наше приложение и файл CSS. Для этого сразу после блока свойств приложения добавим такую строчку:

<s:Application xmlns...">
    <fx:Style source="styles.css"/>

Теперь, если вы запустите своё приложение, вы увидите, что все кнопки и заголовок изменили цвет текста и заливки. Мы на это не остановимся. Мы изменим размер шрифта, стиль шрифта и т.д. Причём сделаем это для разных элементов управления по-разному. Приведу пример кода, чтобы подробно обсудить все пункты.

Для темы spark существует несколько вариантов применения стиля:

  • для всех компонентов (глобально)
  • для определённого класса компонента
  • для всех компонентов, у которого явно указано имя стиля
  • для определённого класса компонента, у которого явно указано имя стиля
global
{
    color: #FFFFFF;
    chromeColor: #677a94;
    fontFamily: Arial;
}

s|Panel
{
    fontSize: 16;
}

s|TextInput 
{
    textAlign: right;
    fontSize: 26;
    color: #000000;
}

s|Button
{
    fontSize: 16;
    fontWeight: bold;
}

controls|NumberButton
{
    fontSize: 16;
    fontWeight: bold;
    chromeColor: #889db5;
}

controls|CalcButton.styleC
{
    chromeColor: #C54F4F;
    fontWeight: bold;
}

После блока global следует блок s|Panel, где указан размер шрифта. Это значит, что этот размер будет применён для всех элементов Panel в нашем приложении, если в коде явно не присвоен другой стиль. Далее описывает стиль для элементов s|TextInput и s|Button. Тут всё понятно. Далее стоит такой блок controls|NumberButton. Этот блок будет отвечать за оформление объектов нашего класса NumberButton. Так как этот класс расширяет класс <s:Button>, то при отсутствии этого блока, к нему будет применён стиль s|Button. Если есть желание, можете поэкспериментировать. И последний блок controls|CalcButton.styleC — это специальный блок для объектов класса CalcButton, для которых явно указан этот стиль в коде. Это значит, что если мы не присвоим этот стиль какому-либо объекту <controls:CalcButton> через свойство styleName, то мы его не увидим. Сделаем же это в файле Calculator.mxml кнопке с идентификатором bC. Это будет наша красная кнопка.

<controls:CalcButton id="bC" label="C" fontWeight="normal" styleName="styleC"/>

Теперь вновь запустим приложение

Финальный вид приложения "Калькулятор"

Наш интерфейс готов. Перейдём к программированию.


Тэги: , , ,

Ссылка для вашего сайта.



Комментарии (1)

  • Сергей

    |

    Ты наверное забыл вот это : xmlns:controls=»controls.*»
    добавить чтобы пакет controls подключить))))

    Ответить

Добавить комментарий

Дополнительно