Программирование мобильных телефонов на Java


Программирование мобильных телефонов

  • Введение
  • Глава 1. Устройство мобильных телефонов
  • Глава 2. Платформа Java 2 Micro Edition
  • Глава 3. Средства разработки мобильных приложений
  • Глава 4. Телефонные эмуляторы
  • Глава 5. Механизм работы приложений Java 2 ME
  • Глава 6. Классы пользовательского интерфейса
  • Глава 7. Программирование графики
  • Глава 8. Техника создания игр
  • Глава 9. Мобильная мультимедиа-библиотека
  • Заключение
  • Приложение 1. Основы языка Java
  • Приложение 2. Справочник по Java 2 Micro Edition

     

    Программирование на Java

  • Введение
  • Глава 1. Встроенные типы данных, операции над ними
  • Глава 2. Объектно-ориентированное программирование в Java
  • Глава 3. Пакеты и интерфейсы
  • Глава 4. Классы-оболочки
  • Глава 5. Работа со строками
  • Глава 6. Классы-коллекции
  • Глава 7. Классы-утилиты
  • Глава 8. Принципы построения графического интерфейса
  • Глава 9. Графические примитивы
  • Глава 10. Основные компоненты
  • Глава 11. Размещение компонентов
  • Глава 12. Обработка событий
  • Глава 13. Создание меню
  • Глава 14. Апплеты
  • Глава 15. Изображения и звук
  • Глава 16. Обработка исключительных ситуаций
  • Глава 17. Подпроцессы
  • Глава 18. Потоки ввода/вывода
  • Глава 19. Сетевые средства Java
  • Приложение. Развитие Java

  • 

    3fb01dc2


     

     

    Вывод текста средствами Java 2D

    Шрифт — объект класса Font — кроме имени, стиля и размера имеет еще полтора десятка атрибутов: подчеркивание, перечеркивание, наклон, цвет шрифта и цвет фона, ширину и толщину символов, аффинное преобразование, расположение слева направо или справа налево.

    Атрибуты шрифта задаются как статические константы класса TextAttribute. Наиболее используемые атрибуты перечислены в табл. 9.1.

    Таблица 9.1. Атрибуты шрифта

    Атрибут

    Значение

    BACKGROUND

    Цвет фона. Объект, реализующий интерфейс Paint

    FOREGROUND

    Цвет текста. Объект, реализующий интерфейс Paint

    BIDI EMBEDDED

    Уровень вложенности просмотра текста. Целое от 1 до 1 5

    CHAR_REPLACEMENT

    Фигура, заменяющая символ. Объект GraphicAttribute

    FAMILY

    Семейство шрифта. Строка типа string

    FONT

    Шрифт. Объект класса Font

    JUSTIFICATION

    Допуск при выравнивании абзаца. Объект класса Float со значениями от 0,0 до 1,0. Есть две константы: JUSTIFICATION FULL И JUSTIFICATION NONE

    POSTURE

    Наклон шрифта. Объект класса Float. Есть две константы:

    POSTURE_OBLIQUE И POSTURE_REGULAR

    RUNJHRECTION

    Просмотр текста: RUN DIRECTION LTR — слева направо, RUN DIRECTION RTL — справа налево

    SIZE

    Размер шрифта в пунктах. Объект класса Float

    STRIKETHROUGH

    Перечеркивание шрифта. Задается константой STRIKETHROUGH ON, по умолчанию перечеркивания нет

    SUPERSCRIPT

    Подстрочные или надстрочные индексы. Константы: SUPERSCRIPT_NONE, SUPERSCRIPT_SUB, SUPERSCRIPT_SUPER

    SWAP COLORS

    Замена местами цвета текста и цвета фона. Константа SWAP COLORS ON, по умолчанию замены нет

    TRANSFORM

    Преобразование шрифта. Объект класса AffineTransform

    UNDERLINE

    Подчеркивание шрифта. Константы: UNDERLINE_ON, UNDERLINE_LOW_DASHED, UNDERLINE_LOW_DOTTED, UNDERLINE LOW GRAY, UNDERLINE LOW ONE PIXEL, UNDERLINE_LOW_TWO_PIXEL

    WEIGHT

    Толщина шрифта. Константы: WEIGHT ULTRA LIGHT, WEIGHT _ EXTRA_LIGHT, WEIGHT _ LIGHT, WEIGHT _ DEMILIGHT, WEIGHT _ REGULAR, WEIGHT _ SEMIBOLD, WEIGHT MEDIUM, WEIGHT DEMIBOLD, WEIGHT _ BOLD, WEIGHT HEAVY, WEIGHT _ EXTRABOLD, WEIGHT _ ULTRABOLD

    WIDTH

    Ширина шрифта. Константы: WIDTH CONDENSED,WIDTH SEMI CONDENSED, WIDTH REGULAR, WIDTH_SEMI_EXTENDED, WIDTH_EXTENDED

    К сожалению, не все шрифты позволяют задать все атрибуты. Посмотреть список допустимых атрибутов для данного шрифта можно методом getAvailableAttributes() класса Font.

    В классе Font есть конструктор FontfMap attributes), которым можно сразу задать нужные атрибуты создаваемому шрифту. Это требует предварительной записи атрибутов в специально созданный для этой цели объект класса, реализующего Интерфейс Map: Класса HashMap, WeakHashMap или Hashtable (см. главу 7). Например:

    HashMap hm = new HashMap ();

    hm.put(TextAttribute.SIZE, new Float(60.Of));

    hm.put(TextAttribute.POSTURE, TextAttribute.POSTUREJDBLIQUE);

    Font f = new Font(hm);

    Можно создать шрифт и вторым конструктором, которым мы пользовались в листинге 9.2, а потом добавлять и изменять атрибуты методами deriveFont () Класса Font.

    Текст в Java 2D обладает собственным контекстом — объектом класса FontRenderContext, хранящим всю информацию, необходимую для вывода текста. Получить его можно методом getFontRendercontext () класса Graphics2D.

    Вся информация о тексте, в том числе и об его контексте, собирается в объекте класса TextLayout. Этот класс в Java 2D заменяет класс FontMetrics.

    В конструкторе класса TextLayout задается текст, шрифт и контекст. Начало метода paint () со всеми этими определениями может выглядеть так:

    public void paint(Graphics gr){ 

    Graphics2D g = (Graphics2D)gr;

    FontRenderContext frc = g.getFontRenderContex-t(); 

    Font f = new Font("Serif", Font.BOLD, 15); 

    String s = "Какой-то текст";

    TextLayout tl = new TextLayout(s, f, frc) ;    // Продолжение метода }

    В классе TextLayout есть не только более двадцати методов getxxxo, позволяющих узнать различные сведения о тексте, его шрифте и контексте, но и метод

    draw(Graphics2D g, float x, float у)

    вычерчивающий содержимое объекта класса TextLayout в графический области g, начиная с точки (х, у).

    Еще один интересный метод

    getOutline(AffineTransform at)

    возвращает контур шрифта в виде объекта shape. Этот контур можно затем заполнить по какому-нибудь образцу или вывести только контур, как показано в листинге 9.6.

    Листинг 9.6. Вывод текста средствами Java 20 

    import java.awt.*; 

    import j ava.awt.font.*; 

    import j ava.awt.geom.*; 

    import java.awt.event.*

    class StillText extends Frame{ 

    StillText(String s) { 

    super(s);

    setSize(400, 200); 

    setvisible(true); 

    addWindowListener(new WindowAdapter(){

    public void windowClosing(WindowEvent ev){

    System.exit(0) ; 

    }

    }); 

    }

    public void paint(Graphics gr){ 

    Graphics2D g = (Graphics2D)gr; 

    int w = getSize().width, h = getSize().height; 

    FontRenderContext frc = g.getFontRenderContext(); 

    String s = "Тень";

    Font f = new Font("Serif", Font.BOLD, h/3); 

    TextLayout tl = new TextLayout(s, f, frc);

    AffineTransform at = new AffineTransform(); 

    at.setToTranslation(w/2-tl.getBounds().getwidth()/2, h/2);

    Shape sh = tl.getOutline(at); 

    g.draw(sh);

    AffineTransform atsh =

    new AffineTransform(1, 0.0, 1.5, -1, 0.0, 0.0);

    g.transform(at);

    g.transform(atsh);

    Font df = f.deriveFont(atsh);

    TextLayout dtl = new TextLayout(s, df, frc);

    Shape sh2 = dtl.getOutline(atsh);

    g.fill(sh2); } public static void main(Stnng[] args) {

    new StillText(" Эффект тени"); 

    }

    На рис. 9.6 показан вывод этой программы.

    Рис. 9.6. Вывод текста  средствами Java 2D

    Еще одна возможность создать текст с атрибутами — определить объект класса Attributedstring из пакета j ava. text. Конструктор этого класса

    AttributedString(String text, Map attributes)

    задает сразу и текст, и его атрибуты. Затем можно добавить или изменить характеристики текста одним их трех методов addAttibute ().

    Если текст занимает несколько строк, то встает вопрос его форматирования. Для этого  вместо класса TextLayout используется класс LineBreakMeasurer, методы которого позволяют отформатировать абзац. Для каждого сегмента текста можно получить экземпляр класса TextLayout и вывести текст, используя его атрибуты.

    Для редактирования текста необходимо отслеживать курсором (caret) текущую позицию в тексте. Это осуществляется методами класса TextHitinfo, а методы класса TextLayout позволяют получить позицию курсора, выделить блок текста" и подсветить его.

    Наконец, можно задать отдельные правила для вывода каждого символа текста. Для этого надо получить экземпляр класса Glyphvector методом createGiyphvector () класса Font, изменить позицию символа методом setciyphPosition(), задать преобразование символа, если это допустимо для данного шрифта, методом setciyphTransformo, и вывести измененный текст методом drawGiyphVector () класса Graphics2D. Все это показано в листинге 9.7 и на рис. 9.7 — выводе программы листинга 9.7.

    gl9-7.jpg

    Рис. 9.7. Вывод отдельных  символов

    Листинг 9.7. Вывод отдельных символов

    import j ava.awt.*;

    import Java.awt.font.*;

    import java.awt.geom.*;

    import j ava.awt.event.*;

    class GlyphTest extends Frame{ GlyphTest(String s){ super(s) ;

    setSize(400, 150); 

    setVisible(true); 

    addWindowListener(new WindowAdapter(){

    public void windowClosing(WindowEvent ev){

    System.exit(0); 

    }

    }); 

    }

    public void paint(Graphics gr){ 

    int h = 5;

    Graphics2D g = (Graphics2D)gr;

    FontRenderContext frc = g.getFontRenderContext(); 

    Font f = new Font("Serif", Font.BOLD, 30);

    GlyphVector gv = f.createGiyphvector(frc, "Пляшущий текст"); 

    int len = gv.getNumGlyphs(); 

    for (int i = 0; i < len; i++){

    Point2D.Double p = new Point2D.Double(25 * i, h = -h); 

    gv.setGlyphPosition(i, p) ; 

    }

    g.drawGiyphVector(gv, 10, 100); } 

    public static void main(String[] args)(

    new GlyphTest(" Вывод отдельных символов"); 

    }

     

    -
    



    Copyright © vzlom-1.ru 2020-2021