- Графика
- Класс Color
- Класс Paint
- Использование полупрозрачности
- Режим Xfermode
- Сглаживание
- Класс Path
- Класс Canvas
- Класс Bitmap
- Работа с графическими объектами в Android
- Пример кластеризованного шейдинга в Android
- Знакомство с RenderScript. Учебное пособие
- Знакомство с OpenCL для Android. Учебное пособие
- Тесселяция для OpenGL ES 3.1 на Android
- Основы создания интерфейса
- Введение в создание интерфейса
- Создание интерфейса в коде java
Графика
Пакет android.graphics имеет все необходимые библиотеки для работы с двухмерной графикой. Существует несколько подходов для рисования графики.
Для рисования простой графики, которая не будет динамически изменяться во время работы приложения, обычно используют класс, наследующий от View и задействуют метод onDraw().
В метод передаётся объект Canvas, у которого есть различные графические методы.
Стандартная реализация подобного подхода выглядит следующим образом:
В методе setContentView() вместо ссылки на разметку передаётся класс MyView, наследующий от View:
В методе onDraw() можете рисовать:
Для рисования динамической графики больше подойдёт класс SurfaceView, имеющий дополнительные возможности. Данному классу мы посвятим отдельный материал.
Класс Color
Класс Color отвечает за цвета. Цвета можно описывать четырьмя числами в формате ARGB, по одному для каждого канала(Alpha, Red, Green, Blue).
Класс Paint
Класс Paint содержит стили, цвета и другую графическую информацию для рисования графических объектов. Он позволяет выбирать способ отображения графических примитивов, которые вы рисуете на объекте Canvas с помощью методов. Изменяя объект Paint, можно контролировать цвет, стиль, шрифт и специальные эффекты, используемые при рисовании. Например, чтобы установить сплошной цвет для рисования линии, нужно вызвать метод Paint.setColor().
В этом примере мы использовали готовую константу. Также можно указать 32-битное целое число, закодированное в схеме ARGB8888.
Можно установить цвет через его составляющие:
Стиль объекта Paint, задаваемый с помощью метода setStyle(), позволяет рисовать либо очертания графического примитива (STROKE), либо его заливку (FILL), либо и то, и другое сразу (STROKE_AND_FILL).
Помимо этих простых методов класс Paint поддерживает прозрачность и может быть изменён с помощью различных шейдеров, фильтров и эффектов, которые предоставляют богатый набор сложных красок и кистей.
Использование полупрозрачности
Любой цвет в Android содержит свойство прозрачности (альфа-канал). Указать его можно при создании описывающей цвет переменной, используя методы argb() и parseColor():
Но мы можем задать прозрачность уже существующего объекта Paint с помощью метода setAlpha():
Пример использования метода setAlpha() для наложения двух картинок.
Режим Xfermode
Изменение режима Xfermode для объекта Paint влияет на способ наложения новых цветов поверх уже нарисованных. В обычных обстоятельствах при рисовании поверх имеющегося рисунка создастся новый верхний слой. Если новый объект Paint на 100% непрозрачный, он полностью закрасит все, что находится под областью для рисования; если он полупрозрачный, то только затенит лежащие ниже цвета. Подклассы Xfermode позволяют изменить такое поведение.
- AvoidXfermode. Определяет цвет, поверх которого объект Paint не может (или наоборот — может только поверх него) рисовать. Задается также параметр tolerance, указывающий на допустимое отклонение.
- PixelXorXfermode. Применяет простое побитовое исключение (XOR) при рисовании поверх существующих цветов.
- PorterDuffXfermode. Мощный режим, с помощью которого можно использовать любое из шестнадцати правил смешивания изображений Портера-Даффа, управляя процессом наложения кисти на уже существующий рисунок.
Для того чтобы применить один из этих режимов, используйте метод setXferMode():
Сглаживание
При создании нового объекта Paint вы можете передать в его конструктор несколько флагов, которые будут влиять на способ отображения. Одним из наиболее интересных из них считается флаг ANTI_ALIAS_FLAG, обеспечивающий сглаживание диагональных линий, рисуемых объектом Paint (снижая при этом производительность).
Сглаживание играет важную роль в процессе отрисовки текста, значительно упрощает его восприятие. Чтобы сделать текст более гладким, можете использовать флаг SUBPIXEL_TEXT_FLAG, который применяет субпиксельное сглаживание. Можно задать оба этих флага программно, используя методы setSubpixelText() и setAntiAlias():
Класс Path
Класс Path позволяет рисовать контуры разных типов — пунктиры, сглаживание линий и т.д.
Класс Canvas
Класс Canvas представляет собой специальную поверхность (холст), на которой вы можете рисовать. С помощью многочисленных методов класса вы можете рисовать линии, окружности, дуги и так далее.
Класс Bitmap
Класс Bitmap отвечает за растровые картинки.
Источник
Работа с графическими объектами в Android
Пример кластеризованного шейдинга в Android
В данном примере для Android реализованы и сравнены несколько техник шейдинга сцен, содержащих множество источников света. Полный исходный код доступен на GitHub, его также можно скачать по прямой ссылке. Наиболее эффективный метод, показанный в примере – кластеризованный шейдинг, описанный в данном документе. Данный пример – портированная на Android более продвинутая версия для Windows, доступная для скачивания отсюда.
В примере применены следующие методы:
- Прямой рендеринг. В этом методе сцена рендерится, как обычно, и шейдер фрагментов проходит по всему списку источников света, применяя соответствующие к каждому фрагменту, подлежащему шейдингу.
- Отложенный шейдинг. В этом методе сцена сначала рендерится в G-буфер, и освещенность вычисляется в процессе пост-процессинга. Шейдер фрагментов проходит по всему списку источников света для каждого фрагмента.
- Шейдинг четырехугольниками. Это также отложенная техника, но в отличие от предыдущего, каждый источник света рендерится как четырехугольник, вклад каждого суммируется в буфер.
- Кластеризованный шейдинг. В этом режиме все источники света сначала кластеризуются на трехмерной сетке. Далее сцена растеризуется. Шейдер фрагментов сперва определяет, в какую ячейку сетки попадает данный фрагмент и далее проходит по списку источников света, связанных с этим элементом, суммируя влияние каждого.
- CS ячейки. Этот метод сочетает отложенный шейдинг и кластеризацию света. Освещение вычисляется шейдером вычислений, который суммирует вклад каждого источника. Заметьте, что эта техника работает только в случае доступности OpenGLES 3.1.
В нашем примере генерируется следующая картинка:
В папке примеров имеется два решения для Visual Studio:
- ClusteredShadingWindows.sln – решение для Windows, которое может быть собрано как обычное приложение Windows
- ClusteredShadingAndroid.sln – решение для Android. Чтобы его собрать, вам понадобится плагин Visual GDB для Visual Studio. Его можно скачать с сайта visualgdb.com.
Если вы не хотите устанавливать Visual GDB, следуйте инструкциям, указанным в файле readme.txt из папки примеров, чтобы собрать его вручную.
Оригинал статьи.
Знакомство с RenderScript. Учебное пособие
Учебное пособие по RenderScript для Android освещает основные принципы использования RenderScript в разработке приложения для Android 4.2.2 и выше.
Основное внимание в пособии уделено RenderScript, его базовому языку и Java API. Поскольку в пособии используется только Java, хотя и существуют нативные C/C++ аналоги для RenderScript API, и поскольку RenderScript использует метод динамической компиляции (JIT), скомпилированное в результате приложение может быть запущено на любом устройстве с нужной версией Android.
Учебное приложение имеет минималистический графический интерфейс, отображающий результаты вычислений и статистику. Оно реализует простой алгоритм обработки полноэкранного изображения, с которым можно взаимодействовать с помощью прикосновений.
Целевая платформа: Эмуляторы и устройства с Android 4.2.2 и выше
Платформа разработки: Любая
Уровень сложности: Новичок
Для получения дополнительной информации о примере обратитесь к руководству пользователя, находящемуся внутри тестового архива.
Скачать исходный код / документацию.
Оригинал статьи
Знакомство с OpenCL для Android. Учебное пособие
Учебное пособие по OpenCL для Android знакомит с основными принципами использования OpenCL в Android-приложениях. Учебное приложение представляет собой средство интерактивной обработки изображений.
Основное внимание в пособии сосредоточено на том, как использовать OpenCL в Android-приложении, с чего начать писать OpenCL код и как прилинковаться к рантайму OpenCL. Пособие демонстрирует типичную последовательность вызовов OpenCL API и обычный порядок действий для создания простого обработчика изображений с анимацией для устройства OpenCL. Более сложные темы, такие как эффективное совместное использование данных или вопросы производительности OpenCL для Android в данном пособии не рассматриваются.
Уровень сложности: Новичок
Платформа разработки: Любая
Целевая платформа: Устройства с Android 4.2.2 и выше
Целевое устройство: Устройство GPU на устройстве Android
Замечание. Эмулятор Android не поддерживает GPU OpenCL устройство. Чтобы запустить код примера на эмуляторе, измените целевое устройство GPU на CPU путем замены CL_DEVICE_TYPE_GPU на CL_DEVICE_TYPE_CPU в строке 451 файла jni/step.cpp.
Для получения дополнительной информации о примере обратитесь к руководству пользователя, находящемуся внутри тестового архива.
Скачать исходный код / документацию.
Оригинал статьи
Тесселяция для OpenGL ES 3.1 на Android
В данной статье обсуждается, как реализовать и использовать тесселяцию в OpenGL ES 3 на Android. Тесселяция – аппаратное средство, позволяющее графическому процессору (GPU) динамически подразделять примитивы. Она также позволяет управлять размещением новых вершин.
Обычное использование тесселяции – динамическое масштабирование уровня детализации местности в зависимости от расстояния до камеры. Таким образом высокая четкость плотно триангулированной территории сочетается с хорошей производительностью.
Для поддержки данной техники, шейдеры тесселяции в настоящее время добавлены в DirectX 11 и OpenGL 4.0. OpenGL ES пока не имеет шейдеров тесселяции, однако платформа Intel Bay Trail имеет расширение, позволяющее использовать тесселяцию в OpenGL ES 3.0.
Следующие шаги показывают, как GPU использует тесселяцию для динамического масштабирования местности. Исходная местность состоит из сетки низкого разрешения и текстуры карты высот высокого разрешения.
- Шейдер управления тесселяцией подсчитывает расстояние между текущим треугольником и камерой и устанавливает уровень тесселяции в зависимости от вычисленной величины. Чем ближе камера к треугольнику, тем выше уровень тесселяции.
- Шейдер вычисления тесселяции добавляет новые вершины треугольников и перемещает их вверх или вниз в зависимости от значений карты высот высокого разрешения.
В результате треугольники тесселяции, близкие к камере, уточняют карту высот более тонкими деталями и добавляют маленькие углубления и выпуклости там, где камера может их видеть.
Тесселяция выключена
Тесселяция включена
Источник
Основы создания интерфейса
Введение в создание интерфейса
Графический интерфейс пользователя представляет собой иерархию объектов android.view.View и android.view.ViewGroup . Каждый объект ViewGroup представляет контейнер, который содержит и упорядочивает дочерние объекты View . В частности, к контейнерам относят такие элементы, как RelativeLayout, LinearLayout, GridLayout, ConstraintLayout и ряд других.
Простые объекты View представляют собой элементы управления и прочие виджеты, например, кнопки, текстовые поля и т.д., через которые пользователь взаимодействует с программой:
Большинство визуальных элементов, наследующихся от класса View, такие как кнопки, текстовые поля и другие, располагаются в пакете android.widget
При определении визуального у нас есть три стратегии:
Создать элементы управления программно в коде java
Объявить элементы интерфейса в XML
Сочетание обоих способов — базовые элементы разметки определить в XML, а остальные добавлять во время выполнения
Сначала рассмотрим первую стратегию — определение интерейса в коде Java.
Создание интерфейса в коде java
Для работы с визуальными элементами создадим новый проект. В качестве шаблона проекта выберем Empty Activity :
Пусть он будет называться ViewsApp:
И после создания проекта два основных файла, которые будут нас интересовать при создании визуального интерфейса — это класс MainActivity и определение интерфейса для этой activity в файле activity_main.xml .
Определим в классе MainActivity простейший интерфейс:
При создании виджетов в коде Java применяется их конструктор, в который передается контекст данного виджета, а точнее объект android.content.Context , в качестве которого выступает текущий класс MainActivity.
Здесь весь интерфейс представлен элементом TextView, которое предназначено для выводa текста. С помощью методов, которые, как правило, начинаются на set , можно установить различные свойства TextView. Например, в данном случае метод setText() устанавливает текст в поле, а setTextSize() задает высоту шрифта.
Для установки элемента в качестве интерфейса приложения в коде Activity вызывается метод setContentView() , в который передается визуальный элемент.
Если мы запустим приложение, то получим следующий визуальный интерфейс:
Подобным образом мы можем создавать более сложные интерейсы. Например, TextView, вложенный в ConstraintLayout:
Для каждого контейнера конкретные действия по добавлению и позиционированию в нем элемента могут отличаться. В данном случае контейнеров выступает класс ConstraintLayout, поэтому для определения позиционирования и размеров элемента необходимо создать объект ConstraintLayout.LayoutParams . (Для LinearLayout это соответственно будет LinearLayout.LayoutParams, а для RelativeLayout — RelativeLayout.LayoutParams и т.д.). Этот объект инициализируется двумя параметрами: шириной и высотой. Для указания ширины и высоты можно использовать константу ViewGroup.LayoutParams.WRAP_CONTENT , которая устанавливает размеры элемента, необходимые для размещения а экране его содержимого.
Далее определяется позиционирование. В зависимости от типа контейнера набор устанавливаемых свойств может отличаться. Так, строка кода
указывает, что левая граница элемента будет выравниваться по левой ганице контейнера.
указывает, что верхняя граница элемента будет выравниваться по верхней ганице контейнера. В итоге элемент будет размещен в левом верхнем углу ConstraintLayout.
Для установки всех этих значений для конкретного элемента (TextView) в его метод setLayoutParams() передается объект ViewGroup.LayoutParams (или один из его наследников, например, ConstraintLayout.LayoutParams).
Все классы контейнеров, которые наследуются от android.view.ViewGroup (RelativeLayout, LinearLayout, GridLayout, ConstraintLayout и т.д.), имеют метод void addView(android.view.View child) , который позволяет добавить в контейнер другой элемент — обычный виджет типа TextView или другой контейнер. И в данном случае посредством данного метода TextView добавляется в ConstraintLayout:
Опять же отмечу, что для конкретного контейнера конкретные действия могут отличаться, но как правило для всех характерно три этапа:
Создание объекта ViewGroup.LayoutParams и установка его свойств
Передача объекта ViewGroup.LayoutParams в метод setLayoutParams() элемента
Передача элемента для добавления в метод addView() объекта контейнера
Хотя мы можем использовать подобный подход, в то же время более оптимально определять визуальный интерейс в файлах xml, а всю связанную логику определять в классе activity. Тем самым мы достигнем разграничения интерфейса и логики приложения, их легче будет разрабатывать и впоследствии модифицировать. И в следующей теме мы это рассмотрим.
Источник