Delphi D10.X安卓APP开发让原生Toast显示图片

上次完成了《Delphi D10.X安卓APP开发中简单使用原生Toast》,可以快速方便的使用Toast,并且可以自定义显示位置。在此基础上,今天我们来实现在Toast中显示图片的方式。

需要增加的内容

先增加一个可以显示图片的调用申明。

procedure Toast(const msg: string; duration: Integer; gravity: Integer;
  xOffset: Integer; yOffset: Integer; vBitmap: TBitmap); overload;

增加对应的功能过程:

procedure Toast(const msg: string; duration: Integer; gravity: Integer;
xOffset: Integer; yOffset: Integer; vBitmap: TBitmap);
begin
{$IFDEF ANDROID}
  CallInUiThread(
    procedure
    var
      vToast: JToast;
      vImageView: JImageView;
      vLinearLayout: JLinearLayout;
    begin
      vToast := TJToast.JavaClass.makeText(TAndroidHelper.Activity,
        StrToJCharSequence(msg), duration);
      vToast.setGravity(gravity, xOffset, yOffset);
      if Assigned(vBitmap) then
      begin
        // 创建图片显示
        vImageView := TjImageView.JavaClass.init(TAndroidHelper.Context);
        vImageView.setImageBitmap(BitmapToJBitmap(vBitmap));
        vLinearLayout := TJLinearLayout.Wrap(vToast.getView);
        vLinearLayout.addView(vImageView, 0);
      end;
      vToast.show;
    end);
{$ENDIF}
end;

调用方式:

  Toast('居中,显示图片',TToastLength.ShortToast,TGravity.CENTER,0,0,  Image1.Bitmap);

运行后的效果:

在这里插入图片描述

全部代码

这是u_Toast.pas的全部代码,可以复制后生成一个文件使用。因为是新增加了一些内容,就没上传到下载里了。

unit u_Toast;

interface

uses
  System.SysUtils, System.Types, System.Classes, FMX.Graphics,FMX.Surfaces
{$IFDEF ANDROID}
    , FMX.Helpers.Android, Androidapi.JNI.app, Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes, Androidapi.Helpers, Androidapi.JNI.Widget,
  Androidapi.JNI.GraphicsContentViewText
{$ENDIF}
    ;

type
  /// <summary>
  /// Toast显示时间
  /// </summary>
  TToastLength = record
  const
    ShortToast = 0;
    LongToast = 1;
  end;

  /// <summary>
  /// Toast显示位置
  /// </summary>
  TGravity = record
  const
    AXIS_CLIP = 8;
    AXIS_PULL_AFTER = 4;
    AXIS_PULL_BEFORE = 2;
    AXIS_SPECIFIED = 1;
    AXIS_X_SHIFT = 0;
    AXIS_Y_SHIFT = 4;
    BOTTOM = 80;
    CENTER = 17;
    CENTER_HORIZONTAL = 1;
    CENTER_VERTICAL = 16;
    CLIP_HORIZONTAL = 8;
    CLIP_VERTICAL = 128;
    DISPLAY_CLIP_HORIZONTAL = 16777216;
    DISPLAY_CLIP_VERTICAL = 268435456;
    &END = 8388613;
    FILL = 119;
    FILL_HORIZONTAL = 7;
    FILL_VERTICAL = 112;
    HORIZONTAL_GRAVITY_MASK = 7;
    LEFT = 3;
    NO_GRAVITY = 0;
    RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615;
    RELATIVE_LAYOUT_DIRECTION = 8388608;
    RIGHT = 5;
    START = 8388611;
    TOP = 48;
    VERTICAL_GRAVITY_MASK = 112;
  end;

  /// <summary>
  /// 显示安卓原生Toast
  /// </summary>
  /// <param name="msg">需要显示的内容</param>
  /// <param name="duration">显示时间长短</param>
procedure Toast(const msg: string;
  duration: Integer = TToastLength.ShortToast); overload;

/// <summary>
/// 显示安卓原生Toast
/// </summary>
/// <param name="msg">需要显示的内容</param>
/// <param name="duration">显示时间长短</param>
/// <param name="gravity">显示的位置</param>
/// <param name="xOffset,yOffset">坐标设置</param>
procedure Toast(const msg: string; duration: Integer; gravity: Integer;
  xOffset: Integer; yOffset: Integer); overload;
/// <summary>
/// 显示安卓原生Toast 有图片的
/// </summary>
/// <param name="msg">需要显示的内容</param>
/// <param name="duration">显示时间长短</param>
/// <param name="gravity">显示的位置</param>
/// <param name="xOffset,yOffset">坐标设置</param>
/// <param name="vBitmap">需要显示的图片</param>
procedure Toast(const msg: string; duration: Integer; gravity: Integer;
  xOffset: Integer; yOffset: Integer; vBitmap: TBitmap); overload;

implementation

{$IFDEF ANDROID}
function BitmapToJBitmap(Bmp: TBitmap): JBitmap;
var
  mBitmap: JBitmap;
  Surface: TBitmapSurface;
begin
  Surface := TBitmapSurface.Create;
  Surface.Assign(Bmp);
  mBitmap := TJBitmap.JavaClass.createBitmap(Bmp.Width, Bmp.Height,
    TJBitmap_Config.JavaClass.ARGB_8888);
  if SurfaceToJBitmap(Surface, mBitmap) then
    Result := mBitmap;
end;
{$ENDIF}

procedure Toast(const msg: string; duration: Integer = TToastLength.ShortToast);
begin
{$IFDEF ANDROID}
  CallInUiThread(
    procedure
    begin
      TJToast.JavaClass.makeText(TAndroidHelper.Activity,
        StrToJCharSequence(msg), duration).show;
    end);
{$ENDIF}
end;

procedure Toast(const msg: string; duration: Integer; gravity: Integer;
xOffset: Integer; yOffset: Integer);
begin
  Toast(msg, duration, gravity, xOffset, yOffset, nil);
end;

procedure Toast(const msg: string; duration: Integer; gravity: Integer;
xOffset: Integer; yOffset: Integer; vBitmap: TBitmap);
begin
{$IFDEF ANDROID}
  CallInUiThread(
    procedure
    var
      vToast: JToast;
      vImageView: JImageView;
      vLinearLayout: JLinearLayout;
    begin
      vToast := TJToast.JavaClass.makeText(TAndroidHelper.Activity,
        StrToJCharSequence(msg), duration);
      vToast.setGravity(gravity, xOffset, yOffset);
      if Assigned(vBitmap) then
      begin
        // 创建图片显示
        vImageView := TjImageView.JavaClass.init(TAndroidHelper.Context);
        vImageView.setImageBitmap(BitmapToJBitmap(vBitmap));
        vLinearLayout := TJLinearLayout.Wrap(vToast.getView);
        vLinearLayout.addView(vImageView, 0);
      end;
      vToast.show;
    end);
{$ENDIF}
end;

end.

相关文章导读

Delphi D10.X安卓APP开发中简单使用原生Toast》这是上一篇的内容,也是这篇的基础。
点击上面标题后直接查看

之前的文章《Delphi D10.X安卓APP开发中简单使用原生Toast》有Demo与代码,可以在“Delphi开发安卓APP中使用原生Toast”下载,但不包括显示图片的内容。可自行把今天的内容增加上。


欢迎光顾本人小店:(https://shop63778938.taobao.com/)
小店也提供delphi方面其他技术支持、定制开发。

现在就进店看看

大家有什么不清楚的,可以给我留言讨论
以上信息对您有用的话请点赞收藏,就下面这行

发布了36 篇原创文章 · 获赞 55 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/tanqth/article/details/104728239