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


Виталий Донцов

11.3. Компоненты типа Image и Paint

Для собственно рисования имеются компоненты PaintBox и Image (обычно для иллюстраций) из группы Shapes, имеющие свойства для рисования: Bitmap, Canvas, Begin Scene и End Scene (внутри которых происходит подготовка к рисованию), для загрузки рисунков – загрузка из файла и из потока: LoadFromFile (директория, имя файлы,) LoadFromStreem (…); сохранить и распечатать рисунок:

Chart1.SaveToBitmapFile('c:\Папка\btmp.jpg’);

ShellExecute (0, ’print’, 'c:\Папка\btmp.jpg’, nil, nil, 0);


В свойстве WrapMode: Stretch: отображать целиком с искажениями по размеру компонента; Center: отображается только центральная часть иллюстрации; Fit: масштабирование без искажений; Original: отображается левая верхняя граница в пределах компонента; Tile: если размер картинки меньше, то выводятся «плитки» картинки.

Вывод подготовленных ранее рисунков осуществляется с помщью PaintBox1.PaintTo () с указанием Canvas и области выведения: константы Rect; PaintBox1.Canvas. DrawBitmap () с указанием Bitmap и областей Rect начального и конечного переноса.

Методы рисования позволяют нарисовать элементарные фигуры например, PaintBox1.Canvas.FillRect () – закрашенный прямоугольник с закругленными краями, и др. Доступ к Image, являющимся объектом TCanvas, осуществляется через свойство Bitmap.

В общем виде вывод рисунка проводится как:

Объект.Canvas. Метод (параметры): PaintBox1.Canvas.FillRect ().

Свойство Canvas имеет возможности нарисовать различные фигуры (draw) – линию, прямоугольник, эллипс, и закрасить их (Fill). Цвет можно определить через TAlphaColor. Blue (и др. цвета выводимые подсказкой). Толщину и вид линии определяют свойтва Stroke, Thickness и StokeDash, а стиль закраски – FillKind.

Важно: для вывода рисунка его надо оформить внутри Begin Scene и End Scene. Координаты задаются для линии точками X и Y начала и конца линии, объекта TPoint; для других фигур – объектом TRect, описывающий область. Код для рисования линии на компоненте Image1 при открытии приложения:

procedure TForm1.FormPaint (Sender: TObject; Canvas: TCanvas; const ARect: TRectF);

var

p1,p2:TPointF;

begin

p1.X:=Image1.Position. X;

p1.Y:=Image1.Position. Y;

p2.X:=Image1.Position. X+100;

p2.Y:=Image1.Position. Y+150;

if Canvas.BeginScene =true then

try

Canvas.Stroke.Kind:=TBrushKind.Solid;

Canvas. DrawLine (p1,p2,10);

finally

Canvas. EndScene;

endend;

var

p1,p2:TPoint;

begin // Рисует линию

p1.X:= 40;

p1.Y:= 40;

p2.X:= 100;

p2.Y:= 100;

Image1.Canvas.BeginScene;

Image1.Canvas. DrawLine (p1,p2,1.0);

Image1.Canvas. EndScene;

end;

//Рисует квадрат

Var

R: Trect;

begin

R. Left:= 30;

R.Top:= 30;

R. Right:= 100;

R.Bottom:= 100; // Y1

Image1.Canvas.BeginScene; //создание графической сцены

Canvas.Fill.Kind:= TBrushKind. bkSolid; // Тип линии

Canvas.Fill.Color:= TAlphaColors. Blue; // Цвет закраски области

Image1.Canvas.DrawRect(r,5,5,[TCorner.TopLeft,

TCorner.BottomLeft],0.8);

Image1.Canvas. EndScene; //завершение сцены и вывод изображения на экран

end;

DrawRect(r,5,5,[TCorner.TopLeft, TCorner.BottomLeft],0.8) – включает указания на область вывода прямоугольника (r), радиусы закругления углов (5,5) с указанием какие именно углы следует закруглить [TCorner.TopLeft, TCorner.BottomLeft] и указать степень прозрачности фигуры (0.8).

Для прорисовки на поверхности холста графического образа следует создать Bitmap: метод DrawBitmap (const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single; const HighSpeed: Boolean = False):

var

ABitmap: TBitmap;

aWidth, aHeight: integer;

SrcRect, DstRect: TRectF;

begin

with Form1.Canvas do

begin

ABitmap:= TBitmap.Create;

aWidth:= ABitmap. Width;

aHeight:= ABitmap. Height;

SrcRect:= RectF (0,0,aWidth, aHeight);

DstRect:= SrcRect;

if BeginScene then

begin

DrawBitmap (ABitmap, SrcRect, DstRect,1,true);

EndScene;

end;

end; end;

Изображение ABitmap полностью или его части представлено SrcRect, место вывода и размеры – в параметре DstRect.

Параметр HighSpeed позволяет предпочтение скорости (true) или качеству (false) вывода.

Фрагмент исходного рисунка, можно ограничить в SrcRect. Управляя размерами области DstRect, можем увеличить или уменьшить рисунок.

Метод Paint: PaintTo (const ACanvas: TCanvas; const ARect: TRectF; const AParent: TFmxObject = nil); пример: рисуем увеличенную в 2 раза кнопку:

Form1.Canvas.BeginScene;

Button1.PaintTo(Form1.Canvas, RectF (0,0,Button1.Width* 2,Button1. Height*2));

Form1.Canvas. EndScene;


Надо отметить, что если в событии OnPaint Формы все рисуется прекрасно, то при попытке сделать это же при нажатии кнопки можно получить что угодно, а обычно ничего, или кратковременный вывод рисунка на экран, который тут же исчезает. Чтобы получить устойчивую фигуру нужно сделать довольно много, в отличие от обычного Delphi 7. На примере компонента Path, позволяющего рисовать полилинии:

Вначале определяется глобальная переменная Path:

var

Form1: TForm1;

Path: TPathData;

Затем при открытии формы создается траектория Path:

procedure TForm1.FormCreate (Sender: TObject);

begin

Path:= TPathData.Create; //Создаем траекторию

end;


Определяется событие OnPaint для Image (или для Form1):

procedure TForm1.Image1Paint (Sender: TObject; Canvas: TCanvas; const ARect: TRectF);

begin

with Canvas do

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

try

Clear (TAlphaColorRec. White);

Stroke.Kind:= TBrushKind.Solid;

Stroke.Thickness:= 1;

DrawPath (Path,1); //Рисовать Path при обращении

finally

EndScene;

end;


Собственно рисуем линию на Image по щелчку на кнопке:

procedure TForm1.Button1Click (Sender: TObject);

var

p,p1:TPointF;

begin

p.X:= Image1.Position. X;

p.Y:= Image1.Position. Y;

Path.Clear; // Очистить Path

Path.MoveTo (p1); // Начальная точка рисования

p1.X:= Image1.Position. X+100;

p1.Y:= Image1.Position. Y+150;

Path.LineTo (p1); // Линия от начальной точки

Path.ClosePath; // Оконачание создания Path

// Вывод созданной Path в Image

Image1.OnPaint(Sender,Image1.Canvas,Image1.ClipRect);

end;


Для добавления элементов используют Path1.Data.Add

(или: Image1.AddObject (TEllipse)):

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

begin

X:=X+5; // X с шагом = 5 точек

R.Top:=Path1.Height – StrToInt(Memo1.Lines [i]) // Y

R.Bottom:=R.Top +3; // Диаметр кружка: 1+3=4

R. Left:= X;

R. Right:=R. Left +3;

Path1.Data.AddEllipse (R); //Рисуем кружок

end;

Как видите, рисование в Android не доставляет того же удовольствия, как в Delphi 7. Поэтому гораздо проще использовать фигуры из группы Shape, которые не требует ничего этого и свойства которых можно определять в Object Inspector.

Мы используем куки-файлы, чтобы вы могли быстрее и удобнее пользоваться сайтом. Подробнее