如何以编程方式截取整个屏幕的屏幕截图?

问题描述 投票:0回答:1

我需要允许我在 Delphi 中以编程方式截取屏幕截图的代码。解决办法如下:

如何在 Android 上以编程方式截取屏幕截图?

如何在 Delphi Android 应用程序中执行此操作?这是我的代码,但只捕获 TControls 而不是 Android 屏幕。

function MakeScaleScreenshot(Sender:TControl): TBitmap;
var
  fScreenScale: Single;

  function GetScreenScale: Single;
  var
    ScreenService: IFMXScreenService;
  begin
    Result := 1;
    if TPlatformServices.Current.SupportsPlatformService (IFMXScreenService, IInterface(ScreenService)) then
    begin
      Result := ScreenService.GetScreenScale;
    end;
  end;

begin
  fScreenScale := GetScreenScale;
  Result := TBitmap.Create(Round(Sender.Width*fScreenScale), Round(Sender.Height*fScreenScale));
  Result.Clear(0);
  if Result.Canvas.BeginScene then
  try
    Sender.PaintTo(Result.Canvas, RectF(0,0,Result.Width,Result.Height));
  finally
    Result.Canvas.EndScene;
  end;
end;
android delphi screenshot firemonkey
1个回答
0
投票

如果您想以编程方式捕获整个Android屏幕,可以使用以下代码:

uses
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Net, FMX.Helpers.Android;

function TakeScreenshot: JBitmap;
var
  WindowManager: JWindowManager;
  Display: JDisplay;
  DisplayMetrics: JDisplayMetrics;
  ScreenBitmap: JBitmap;
begin
  WindowManager := SharedActivityContext.getSystemService(TJContext.JavaClass.WINDOW_SERVICE);
  Display := WindowManager.getDefaultDisplay;
  DisplayMetrics := TJDisplayMetrics.Create;
  Display.getMetrics(DisplayMetrics);

  ScreenBitmap := TJBitmapClass.CreateBitmap(DisplayMetrics.widthPixels, DisplayMetrics.heightPixels, TJBitmap_Config.JavaClass.ARGB_8888);
  TJViewGroup(SharedActivity.findViewById(TAndroidHelper.Activity.getWindow.getDecorView.getId)).draw(TJCanvas.JavaClass.init(ScreenBitmap));

  Result := ScreenBitmap;
end;

它使用 Android API 来获取窗口管理器并显示指标。

它创建一个与 Android 屏幕大小相匹配的位图 (JBitmap)。

它使用draw方法捕获Android屏幕的内容并将其存储在位图中。

确保添加必要的 Android 依赖项并在您的 Delphi 项目中包含用于 Android 开发的正确单元

© www.soinside.com 2019 - 2024. All rights reserved.