FMX.Graphics.TCanvas.DrawEllipse не работает на Android

#delphi #firemonkey #rad-studio

#delphi #firemonkey #rad-studio

Вопрос:

Я создаю простое приложение для рисования с помощью FireMonkey и Delphi. Все, что он действительно делает, это рисует линии и эллипсы. Это код:

 Image1.Bitmap.Canvas.BeginScene;
with Form1 do begin
for i := 0 to 360 do
  if (i mod 15)=0 then
  begin
    p1 := TPointF.Create(PX, PY);
    p2 := TPointF.Create(Round(PX 200*sin(i*pi/180)), Round(PY 200*cos(i*pi/180)));
    Image1.Bitmap.Canvas.DrawLine(p1, p2, 100);
  end;

for i := 0 to 200 do
  if (i mod 20)=0 then
  begin
    prst1 := TRectF.Create(PX i,PY i,PX-i,PY-i);
    Image1.Bitmap.Canvas.DrawEllipse(prst1, 100);
  end;
 Image1.Bitmap.Canvas.EndScene;
  end;
  

Этот код отлично работает, когда я компилирую его под Win32 или Win64. Но когда я пытаюсь скомпилировать его и запустить на устройстве Android, отображаются только строки, а многоточия просто отсутствуют. У кого-нибудь есть идеи, почему это происходит?

Заранее благодарю вас за вашу помощь!

Комментарии:

1. Рисование внутри элемента управления image на самом деле не является правильным способом рисования на экране. Попробуйте рисовать непосредственно на холсте формы из OnPaint обработчика событий формы.

2. Пожалуйста, всегда предоставляйте подробную информацию, такую как инициализация переменных и их типы. Например. Какое значение имеют PX и PY при вводе? Что, если они окажутся 123456? Каков контекст кода? Обработчик событий? Ваш определенный метод? Каковы значения brush и stroke свойств? Дополнительный вопрос: каково значение непрозрачности для полностью непрозрачной линии?

3. @TomBrunberg Прошу прощения за это. Оба PX и PY имеют размер 200, а TImage — 400×400, так что на самом деле они просто представляют центр TImage . Код находится в ButtonClick процессе — я просто хочу нарисовать поверхность, подобную радару, на изображении. Затем я рисую на нем траектории. У меня просто есть значения свойств stroke и color , они 3 для stroke и TAlphaColors.Black для color . Значение непрозрачности в инспекторе объектов для TImage равно 1 (если это то, о чем вы спрашиваете).

4. У меня просто проблема с пониманием того, почему один и тот же код FireMonkey работает под Win32, но не работает под Android. Я довольно новичок в Delphi и полагал, что один и тот же код будет работать одинаково в обоих из них. Embarcadero wiki на самом деле не так уж полезен для меня с моими ограниченными знаниями. Будет ли использование TPaintBox лучше, чем TImage в моей ситуации, когда я хочу нарисовать на нем несколько траекторий (поэтому редактирую его в цикле, который работает примерно на 1000 шагов)?

5. Спасибо, что ответили на мой комментарий, но, пожалуйста, добавьте эту информацию к вашему вопросу, здесь, в комментариях, это так легко упустить из виду. Мой вопрос относительно непрозрачности вытекает из вашей строки: Image1.Bitmap.Canvas.DrawLine(p1, p2, 100); . Третий параметр — это непрозрачность, 0 ..1.0 согласно документам, но хорошо, все, что выше 1.0, считается 1.0.

Ответ №1:

Вы можете рисовать на Form.Canvas в OnPaint обработчике событий. Вот пример:

 procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
begin
  with Canvas do begin
    BeginUpdate;
    try
      Stroke.Kind := TBrushKind.Solid;
      Stroke.Thickness := 2.0;
      DrawEllipse(ARect,1);
      DrawLine(PointF(ARect.Left,ARect.Height / 2), PointF(ARect.right,ARect.Height / 2), 1);
      DrawLine(PointF(ARect.Left (ARect.Width / 2),ARect.Height), PointF(ARect.Left (ARect.Width / 2),0), 1);
    finally
      EndUpdate;
    end;
  end;
end;