• 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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу