Перейти к содержанию
Fire Monkey от А до Я
  • 0

При загрузке картинки из ресурсов виснет приложение


Armageddets

Вопрос

Всем доброго времени суток. Начал осваивать создание приложений на андроид и столкнулся с проблемой. Приложение компилировалось ровно до того момента пока я не попытался загружать изображение из ресурсов. В ресурсы добавлена картинка с именем Fon (идентификатор FonMain) и типом RCData, формат Bmp (24 бита). Если убрать строчку DownloadImages,  то приложение скопилируется и запустится.

Код прилагаю ниже. Прошу помощи разобраться в проблеме - где я допустил ошибку? Учусь по статьям в интернете и довольно большая часть кода от туда не работает (даже с получением разрешения экрана были проблемы - пришлось пока ориентироваться просто на размер формы временно).

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Helpers.Android, Androidapi.JNI.Util;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Buf:TBitmap;
  Regim,Xr,Yr:integer;
  fon:Tbitmap;
  procedure DownloadImages;

implementation

{$R *.fmx}
{$R *.LgXhdpiPh.fmx ANDROID}

procedure DownloadImages;
var RS: TResourceStream;
begin

  RS:=TResourceStream.Create(HInstance, 'FonMain', RT_RCData);
  try
    Fon.Width:=420;
    Fon.Height:=680;
    Fon.LoadFromStream(RS);
  finally
    RS.Free;
  end;

end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Regim:=0;
  Buf:=TBitmap.Create;
  Buf.Width:=420;
  Buf.Height:=680;
  form1.Border.Styling:=false;

  DownloadImages; //zagruzka kartinok

end;

procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
  var C1,C2:TRectF;
begin
  Form1.Canvas.BeginScene;
  C1:=rectF(0,0,420,680);
  C2:=rectF(0,0,420,680);
  fon.SetSize(420,680);
  Buf.Canvas.DrawBitmap(fon,C1, C2, 0);
  form1.Canvas.DrawBitmap(Buf,C1, C2, 0);
  Form1.Canvas.EndScene;

end;

procedure TForm1.FormResize(Sender: TObject);
begin
Xr:=form1.ClientWidth;
Yr:=form1.ClientHeight;
//Showmessage(Inttostr(Xr)+'x'+Inttostr(Yr));
end;

end.

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

procedure DownloadImages;
var RS: TResourceStream;
begin

  RS:=TResourceStream.Create(HInstance, 'FonMain', RT_RCData);
  try

Fon  <<<<<<<<<<<<<<<<<< Где Create???
    Fon.Width:=420;
    Fon.Height:=680;
    Fon.LoadFromStream(RS);
  finally
    RS.Free;
  end;

end;

 

Тута нет

procedure TForm1.FormCreate(Sender: TObject);
begin
  Regim:=0;
  Buf:=TBitmap.Create;
  Buf.Width:=420;
  Buf.Height:=680;
  form1.Border.Styling:=false;

  DownloadImages; //zagruzka kartinok

end;

Ссылка на комментарий
  • 0

А разве bmp вообще на Android поддерживается?? 

Да и не нужны в этом приложении ресурсы как в Windows.

Есть Deployment, это более современный способ помещения данных в проект.

 

Кроме того, обращение к переменной класса Form1 в методе класса TForm1 - это ошибка.

Перегружать рисование формы -FormPaint  тоже не из этого мира. Это все должно остаться в VCL / WinApi

 

Давайте сначала начнем - что хотели сделать изначально?

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
5 часов назад, krapotkin сказал:

А разве bmp вообще на Android поддерживается?? 

Да и не нужны в этом приложении ресурсы как в Windows.

Давайте сначала начнем - что хотели сделать изначально?

Он, может, хотел скрыть от посторонних свои картинки. Если запихивать их в Deployment, то любой может распаковать APK и вытащить всё что угодно из assets. А если в ресурсы запихать, то их не достанешь никак

Ссылка на комментарий
  • 0

Спасибо всем большое. Да пропустил Create по невнимательности.
А картинки я через resource and images загружаю так как все примеры, которые я находил так загружали. В Deployment тоже отображается путь к моей картинке на пк.
По поводу bmp - в ресурсах увидел тип данных bitmap, поэтому, видимо, ошибочно решил, что поддержка этого формата есть.
Проект, который я делаю - это мини игра (из старого своего проекта), которую я решил попробовать портировать под андроид и заодно разобраться с программированием под андроид

В итоге я сделал следующие изменения:
Прорисовку убрал из FormPaint в таймер:
procedure TForm1.Timer1Timer(Sender: TObject);
  var C1,C2:TRectF;
begin
  Canvas.BeginScene;
  C1:=rectF(0,0,420,680);
  C2:=rectF(0,0,420,680);
  fon.SetSize(420,680);
  Buf.Canvas.DrawBitmap(fon,C1, C2, 0); //0-1 prozrachnost (opacity), 0.5  - na polovinu prozrachniy
  Canvas.DrawBitmap(Buf,C1, C2, 0);
  Canvas.EndScene;
end;

Картинку bmp перезалил в формате jpg и добавил недостающую строчку Fon.Create;

procedure DownloadImages;
var RS: TResourceStream;
begin

  RS:=TResourceStream.Create(HInstance, 'FonMain', RT_RCData);
  try
    fon.Create;

    Fon.Width:=420;
    Fon.Height:=680;
    Fon.LoadFromStream(RS);
  finally
    RS.Free;
  end;

end;

Но в итоге андроид приложение все еще виснет на отображении картинки заставки с огнем (то есть загрузка изображения все еще не идет).

Изменено пользователем Armageddets
Ссылка на комментарий
  • 0

Ой - грубая ошибка с моей стороны. Прошу прощения.

Теперь зависание и правда пропало - единственное - изображение так и не рисуется на форме - просто черный экран. Видимо я все еще делаю что-то не так. Компилирую приложение на Leagoo T5c (Android 7).

Может я неправильно задаю параметры в прорисовке DrawBitmap?

Ссылка на комментарий
  • 0

Исправил код на вот такой, но рисуется вместо картинки черный квадрат, а выставляя половинную прозрачность рисуется серый квадрат. То есть прозрачность - применяется.

procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
  var C1,C2:TRectF;
begin
  PaintBox1.Canvas.BeginScene;
  C1:=rectF(0,0,420,680);
  C2:=rectF(0,0,420,680);
  fon.SetSize(420,680);
  Buf.Canvas.DrawBitmap(fon,C1, C2, 1); //0-1 prozrachnost (opacity), 0.5  - na polovinu prozrachniy
  PaintBox1.Canvas.DrawBitmap(Buf,C1, C2, 0);
  PaintBox1.Canvas.EndScene;
end;

Сам проект тоже прилагаю, может я с ним нахимичил что-то:
https://dropmefiles.com/XXqWc

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

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