• 0
xenon54

TCanvas [TCanvas] Как при отрисовки не вылезьте за указанную область?

Вопрос

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

Поясню на примере:

Canvas.FillText(TRectF.Create(0,-10,100,10),'11111',True,1,FillTextFlags,TTextAlign.Leading);

Если написать это в методе Paint у контрола, то верхняя половина текста вылезет и нарисуется на форме. Как этого избежать?

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

HarrisNuh понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

3 ответа на этот вопрос

  • 0

Вопрос с невылезанием за контрол снимается, тут видимо криворукость не дала нужного эффекта при применении буферного битмапа с первого раза. Остается вопрос с размытостью.

Если рисовать текст сразу на канве, то все четко получается, а если текст рисовать на буферной канве, а поотм переносить на основную canvas.DrawBitmap, то текст немного размыт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Достаточно установить у контрола 

ClipChildren = True

Или для канвы установить область отсечения:

Canvas.IntersectClipRect(Button1.LocalRect);
rareMax, Kitty и xenon54 понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Vizit0r
      Delphi Seattle, Android 5.0.1
      Формирую картинку через ScanLine. На выходе полученный битмап рисуется на полотне TImage, на котором перед этим был нарисован Rect.
      GlobalBitmap - формированный tbitmap.
                 with ObjectPreviewImage.Bitmap.Canvas do             begin               BeginScene;               Clear(TAlphaColorRec.White);               DRect := TRectF.Create(0, 0, GlobalBitmap.Width + 8, GlobalBitmap.Height + 8);               DrawRect(DRect, 0, 0, AllCorners,                        StealthForm.ObjectPreviewImage.AbsoluteOpacity);               DRect := TRectF.Create(0, 0, GlobalBitmap.Width, GlobalBitmap.Height);               DrawBitmap(GlobalBitmap,DRect,                  TRectF.Create(2, 2, GlobalBitmap.Width + 2, GlobalBitmap.Height + 2), 1);               EndScene;             end;  
      Проблема собственно в чем - в андроидной версии слева и внизу рамка "съедается". В Win32 версии все отлично. На прилагаемых скриншотах это четко видно.
      Документацию читал, гугл гуглил.
       
      Что я делаю не так? Или это неизвестные подводные камни андроидного рисования на полотне?
       
      P.S. Картинка одинаковая, цвет к определенной области применяется не верно. Походу тоже андроидные приколы. Но с этим я уже разберусь.
      P.P.S. Уже разобрался с цветом - под андроидом Blue и Red в пикселе надо поменять местами. А насчет канвы - не получается никак.
      P

    • Автор: Error
      *** Небольшой обмен опытом ***
      Вижу что вопросы о размере текста довольно частые, поделюсь своими наработками.
      function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF;
      Функция для расчета размера прямоугольника, занимаемого однострочным текстом.
      Параметры:
      Text - Текст Font - Шрифт с которым будет выводиться текст Size - если 0, то Font.Size будет использоваться из Font, иначе из данного параметра Исходный код:
      uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; function CalcTextSize(Text: string; Font: TFont; Size: Single = 0): TSizeF; var TextLayout: TTextLayout; begin TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.Text := Text; TextLayout.MaxSize := TPointF.Create(9999, 9999); TextLayout.Font.Assign(Font); if not SameValue(0, Size) then begin TextLayout.Font.Size := Size; end; TextLayout.WordWrap := False; TextLayout.Trimming := TTextTrimming.None; TextLayout.HorizontalAlign := TTextAlign.Leading; TextLayout.VerticalAlign := TTextAlign.Leading; finally TextLayout.EndUpdate; end; Result.Width := TextLayout.Width; Result.Height := TextLayout.Height; finally TextLayout.Free; end; end;   function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer;
      Функция возвращающая максимально возможный размер шрифта, для текста вписанного в заданный прямоугольник.
      Параметры:
      Text - Текст Font - Шрифт с которым будет выводиться текст Width, Height - Ширина и высота прямоугольника MaxFontSize - Максимально возможный размер шрифта Исходный код:
      uses System.Types, FMX.Types, FMX.Graphics, FMX.TextLayout, System.Math, System.SysUtils; const cMaxFontSize = 512; function FontSizeForBox(Text: string; Font: TFont; Width, Height: Single; MaxFontSize: Single = cMaxFontSize): Integer; var Size, Max, Min, MaxIterations: Integer; Current: TSizeF; begin Max := Trunc(MaxFontSize); Min := 0; MaxIterations := 20; repeat Size := (Max + Min) div 2; Current := CalcTextSize(Text, Font, Size); if ((Abs(Width - Current.Width) < 1) and (Width >= Current.Width)) and ((Abs(Height - Current.Height) < 1) and (Height >= Current.Height)) then break else if (Width < Current.Width) or (Height < Current.Height) then Max := Size else Min := Size; Dec(MaxIterations); until MaxIterations = 0; Result := Size; end; ---
      Также данные функции можно найти в этом юните
    • Автор: Dzuyba
      В TabControl(е) создал TabItem и на его положил кнопку так что бы половина кнопки была не видна. А токого же поведения когда кнопка лежит на панели (TPanel) добится не получается, кнопку всегда видно, даже когда она выходит за рамки панели. Кто может сказать почему и как это исправить?  Для наглядности прицепил картинку с проблеммой

    • Автор: PFC
      Исходно пытался нарисовать битмап на канве формы. Затем пытался нарисовать хоть что-нибудь. Все время получаю пустой экран. При этом аналогично ничего не получается и с TImage и с PaintBox. Проект на С++, Embarcadero XE7. Что я делаю не так?
      SolverMXE7.zip
    • Автор: brunnengi
      Здравствуйте.
      Хочу загнать карту в приложение. Т.е. сделать ПринтСрин нескольких участков, слить их в одно изображение в фотошопе, а потом иметь возможность просматривать на смартфоне под android. Что бы можно было пальцами приблизить, подвигать карту.
      Какой компонет посоветуете?
    • Автор: jekans
      Подскажите пожалуйста глупому человеку , как можно загрузив изображение:
      buf: TBitmap; buf.LoadFromFile('.bmp'); Определить цвет нужного мне пикселя (X,Y), и нарисовать хотя бы линию этого цвета на форме используя обычный: 
      Canvas.DrawLine    
    • Автор: long_island
      Привет. В продолжение этой темы возникла следующая проблема: при скроллинге, когда выделенный item пересекает границу видимой области ListBox'а его background не как должно быть постепенно частично уходит в невидимую область, а остается видимым снаружи ListBox'а до момента, когда верхняя(нижняя) граница Item'а не пересечет нижнюю(верхнюю) границу ListBox'а.
       
      Скриншоты проблемы:
       


       
      C Fire Monkey только начал свое знакомство, некоторые вещи уже понимаются, но причину такого поведения никак не могу понять пока. 
    • Автор: estra
      Может есть аналог процедуры FloodFill из VCL?
    • Автор: Geex
      Приветствую!
      Не понятная ситуация с шириной линии. Рисую горизонтальную линию на канве толщиной толщиной 1 пиксель. 
      Если линия лежит вдоль целых координат, например Y=100 то толщина линии реально получается 2 пикселя.
      А если координаты дробные, например 50.5 то линия в один пиксель. Вот как это выглядит:

      Т.е. я так понимаю, что координаты канвы начинаются не с нуля, а с 0.5.
      Как сделать чтобы отображение целых координат было точно в пиксель?
    • Автор: Brovin Yaroslav
      Как определить, какая канва используется в текущий момент?
  • Сейчас на странице   1 пользователь