• 0
virus_forever

Как рисовать на канве в физическом разрешении экрана?

Вопрос

Всем привет!

Как правильно рисовать в физическом разрешении экрана устройства?

procedure TForm2.btnImageScaledDrawClick(Sender: TObject);
var
  B: TBitmap;
  ScreenSvc: IFMXScreenService;
  ScreenScale: Single;

  procedure FL(x,y,wh: Integer; s: single; c: TAlphaColor);
  begin
   B.Canvas.Fill.Color:= c;
          B.Canvas.Stroke.Kind := TBrushKind.Solid;
          B.Canvas.Stroke.Color := Fill.Color;

          B.Canvas.FillRect(RectF(x, y, x+round(wh * s), y+round(wh * s)), 0, 0, AllCorners, 1);
  end;

  function RGBAtoAlphaColor(r,g,b: Byte; a: Byte = 255): TAlphaColor;
  var
    rec: TAlphaColorRec;
  begin
    rec.R:=r;
    rec.G:=g;
    rec.B:=b;
    rec.A:=a;

    Result:= rec.Color;
  end;
begin
  B:= TBitmap.Create;

  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenSvc)) then
    begin
      ScreenScale:= ScreenSvc.GetScreenScale;

      ScreenSvc:= nil;
    end
  else
    begin
      ScreenScale:= 1;
    end;

  with B do
    begin
      Width:= Round(Image1.Width * ScreenScale);
      Height:= Round(Image1.Height * ScreenScale);

      with Canvas do
        begin
          BeginScene;

          SetMatrix(TMatrix.CreateScaling(1 / Scale, 1 / Scale) * Matrix);

          Clear(RGBAtoAlphaColor(0, 174, 219, 100));

          FL(10,10,300,3,RGBAtoAlphaColor(209,17,65));

          FL(10,10,300,2.5,RGBAtoAlphaColor	(0,177,89));

          FL(10,10,300,2,RGBAtoAlphaColor(243,119,53));

          FL(10,10,300,1.5,RGBAtoAlphaColor(255,196,37));

          FL(10,10,300,1,RGBAtoAlphaColor(73,5,96));

          EndScene;
        end;
    end;

  Image1.Bitmap.Assign(B);

  FreeAndNil(b);
end;

На PC - разумеется все корректно.

На Android - (физическое 1920х1080, масштаб 3, логическое 640х360) - рисует в логических координатах. Еле-еле помещается квадрат 300х300 пикселей.

Может как то по-другому необходимо выводит созданный битмап?

Заранее спасибо!

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


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

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

  • 0

привет, вот здесь http://fire-monkey.ru/topic/1927-сглаживание-при-рисовании-в-буфер-bitmap/?do=findComment&comment=10081

я рисовал в буфер Bitmap и на OnPaint копировал на канву PaintBox с помощью Canvas->DrawBitmap. Все рисовалось и копировалось быстро без морганий, но так и не получилось сглаживать линии.

В конце концов стал рисовать напрямую в канву PaintBox - заработало сглаживание, никаких тормозов и морганий.

Основные требования: рисовать только в OnPaint, между BeginScene() и EndScene() и каждый раз полностью инициализировать все настройки канвы: Stroke, Kind, Dash Color и т.п. 

Изменено пользователем Камышев Александр

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


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

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

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

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

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


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

Войти

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


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу