Читать книгу Программирование для Android и работа с датчиками в среде Delphi 11 - Виталий Иванович Донцов - Страница 22

11. КОМПОНЕНТЫ ДЛЯ 2D И 3D ГРАФИКИ
11.4. РИСОВАНИЕ СРЕДСТВАМИ DELPHI ANDROID

Оглавление

Основной класс для для графики в Delphi Android – TCanvas (т.н. «холст») модуля FMX.Graphics. В отличие от обычного Delphi рисование средствами Delphi Android, в результате попыток создания мультиплатформенности, оказывается резко усложнено и вначале может вообще ничего не получиться с выводом рисунка на экран, а в особенности с динамическим выводом данных, хотя для последнего существует специальный компонент для вывода графиков TChart.

Основу рисования составляет Canvas: TCanvas, который внедрен во многие компоненты и обеспечивает рисование на них. Вывод графики лучше осуществлять в рамках события OnPaint, присутствующего у многих компонентов.


Для оценки цвета можно использовать канал RBG (Red, Blue, Green), максимальное значение 255, у яркости максимальное 240. При переводе в градации серого используется:

Яркость = 0.6*Зеленый +0.3*Красный +0.1*Синий. Коэффициенты отражают неравномерность чувствительности глаза к разным участкам спектра.

В Uses следует добавить: System. UITypes.

Создать цвет, например, для компонента прямоугольник, можно смешав 3 цвета (A: Byte = $FF – прозрачность до 255):

var

col: TAlphaColorRec;

begin

col. R:= 255;

col. G:= 255;

col. B:= 255;

col. A:= 255;

Rectangle1.Fill.Color:= TAlphaColor (col);

Rectangle1.Fill.Kind:= TBrushKind.Solid;

end;


Для назначения цвета можно использовать вывод его в 16-ричном формате: $FFF000000 соответствует непрозрачному красному цвету; но удобнее и чаще всего используют TAlphaColor, который использует и 16-речные значения и стандартные цвета:

var color: TAlphaColors;

color:= TAlphaColors.Red;//Подсказка выводится после точки

Предусмотрены также ряд специализированных компонентов на вкладке Color: TColorPanel, TComboBoxColorPanel, TColotListBox, TColorComboBox, TColorPicker и др.


Рис. 32. Различные компоненты отображения цвета вкладки Color.


Рисование фигур включает прежде всего описание их свойств внутри BeginScene….EndScene. Так, единственный метод вывода линии ранее:

DrawLine (P1, P2, 1);

теперь превращается в целую историю:

в событии OnPaint основной Form1 подготавливаем сцену:

constant R: TREctF;

var

P1, P2: TPointF;

x1, y1,x2, y2: Integer;

color: TAlphaColor;


Begin

x1:= 10;

y1:= 20;

x2:= 100;

y2:= 200;

P1.X:= x1;

P1.Y:= y1;

P2.X:= x2;

P2.Y:= y2;

with Canvas do

if (Edit1.Text = «1») and (BeginScene) then

try

Stroke.Kind:=TBrushKind.Solid;

Stroke.Color:=TAlphaColors. Blue;

Stroke.Thickness:=2;

Canvas. DrawLine (P1, P2, 1);

finally

endScene;

end;

Для вывода рисунка здесь нужно нажать Button и присвоить Edit1.Text значение «1». При не ограничении вывода рисунок появится прямо при открытии Приложения.


Методы Canvas:

Filll – используемая кисть, имеет множество возможностей;

Stroke – кисть-перо для рисования линий;

Font – для шрифта (Name, Size, Color).

Пример для вывода шрифта:

FillText (RectF (20,30, 200,300), «Текст вывода», true, 1, [], TTextAlign. Center);


Заливка фигур осуществляется методом Fill… для прямоугольника (Rect), эллипса (Ellpise), дуги (Arc), полигональной линии (Polygon) и тректории (Path); полные свойства выводятся автоматически при написании в программе.

При этом Path: TPathData уже не конфликтует с путем для файлов Path: TPath, как это имеет место для Path: TPath группы Shape, однако, рисовать Path: TPathData гораздо менее удобно, чем работать с уже готовыми фигурами Path: TPath.


Для Path: TPathData работают известные методы – перемещение в точку:

MoveTo (const P: TPointF);

и проведение линии от предыдущей точки:

LineTo (const P: TPointF);


Для доступа из любого места программы нужно создать глобальную переменную:

var

Form1: TForm1;

Path: TPathData;

При открытии на OnCreate в Form1 создаем траекторию:

Path:=TpathData.Create;

Подготавливаем сцену для визуализаци в OnPaint и Form1:

with Canvas do

if (Path.Count> 0) and (BeginScene) then

try

Stroke.Kind:=TBrushKind.Solid;

Stroke.Color:=TAlphaColors. Blue;

Stroke.Thickness:=2;

DrawPath (Path,1);

finally

endScene;

end;

Для рисования полилинии на экране, например при движении пальцем, используем метод OnTouch в Form1:

OnTouch в Form1:

case Action of

TTouchAction.Down: begin

Path.MoveTo (Touches [0].Location);

end;

TTouchAction.Move: begin

Path.LineTo (Touches [High (Touches)].Location);

FormPaint(Sender,Form1.Canvas,Form1.ClientRect);

end;

Очистить холст можно методами:

Canvas.Clear (const AColor: TAlphaColor = 0)

или только область:

Canvas.Clear (const ARectF; const AColor: TAlphaColor = 0).

Для прорисовки на поверхности холста графической фигуры существует метод DrawBitmap (константы: ABitmap: TBitmap; SrcRect и Dstrect: TRectF: AOpasity: Single; HighSpeed: Boolean = false): выводится все изображение или его часть (SrcRect в область DstRect). Загружать образ фигуры можно из файла:

var ABitmap:= TBitmap.CreateFromFile («Путь и Имя файла»);


для вывода рисунка:

if BeginScene then

begin

DrawBitmap (ABitmap,1,true);

EndScene;

end;


Сохранить настройки холста можно функцией:

SaveState: TCanvasSaveState;

Восстановить:

RestoreState (SaveState: TCanvasSaveState).


Сохранить и загрузить рисунок в Bitmap можно из Object Inspector или программно:

ABitmap. LoadFromFile ();

ABitmap.SaveToFile ();

ABitmap.SaveToStrem ().


Как отмечалось, во многих случаях удобнее отображать данные (которые удобно направлять в Memo) компонентом Path: TPathData, не конфликтующим с Path: TPath путем для файлов. Для этого вначале создаем глобальную переменную:

var Form1: TForm1; Path: TPathData;

При открытии на OnCreate в Form1 создаем траекторию:

Path:=TpathData.Create;

Подготавливаем сцену для визуализаци в OnPaint и Form1:

with Canvas do

if (Edit1.Text = «1») and (BeginScene) then

try

Stroke.Kind:=TBrushKind.Solid;

Stroke.Color:=TAlphaColors. Blue;

Stroke.Thickness:=2;

DrawPath (Path,1);

finally

endScene;

end;

Начало рисования ограничиваем Edit1.Text = «1», который контролируем Button.

Для рисования используем свойство OnPaint для Button:

procedure TForm1.Button3Paint (Sender: TObject; Canvas: TCanvas;

const ARect: TRectF);

var

P: TPointF;

i: Integer;

begin

P.X:= 0;

P.Y:= StrToInt(Memo1.Lines [0]);

Path.MoveTo (P);

for i:= 0 to Memo1.Lines.Count – 2 do

begin

P.X:= i*4;

P.Y:= PlotGrid1.Height – StrToInt(Memo1.Lines [i]);

Path.LineTo (P);

end;

end;

Результат можно видеть на рисунке: накапливаемые данные тут же отражаются на графике (перерисовывается график для данных в Memo пока Edit1.Text = «1»).


Рис. 33. Рисование графика компонентом Path: TPathData.


Все же, гораздо удобнее и проще использовать для вывода данных на график специальный компонент, для этого предназначенный: Chart.

Программирование для Android и работа с датчиками в среде Delphi 11

Подняться наверх