Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS Unterschiedliches verhalten (FMX) Rendern von Childcontrols (https://www.delphipraxis.net/177540-unterschiedliches-verhalten-fmx-rendern-von-childcontrols.html)

Mavarik 12. Nov 2013 14:57

Unterschiedliches verhalten (FMX) Rendern von Childcontrols
 
OK. Mir ist kein besserer Titel eingefallen.

Man nehme eine Scrollbox.
Auf diese Scrollbox wir ein TRectangle erzeugt.
Auf diese TRectangle sollen 1..n Images erzeugt werden, die Text und Grafiken enthalten.

Unter Win32 funktioniert das so...
Delphi-Quellcode:
MyRect := TRectangle.Create(Scollbox1);
MyRect.Parent := Scrollbox1;
MyRect.Width := 768;
MyRect.Height := 0; // !!
MyRect.Position.X := 0;
MyRect.Position.Y := NextYPos;

IMG := TImage.Create(MyRect);
IMG.Parent := MyRect;
IMG.Position.X := LeftFromDatenbank;
IMG.Position.Y := TopFromDatenbank;
MakeBMPInhalt(bla bla bla); // Setzt nach der Berechnung auch die Höhe des Images

if MyRect.Height < IMG.Position.Y+IMG.Height then
  MyRect.Height := IMG.Position.Y+IMG.Height+2;
Unter iOS sind die Positionen des IMG absolut durcheinander.
Und alles ist zu klein, da die doppelte Retina Auflösung nicht berücksichtig wird. Das könnte man ja noch ändern...

Wenn man aber:
Delphi-Quellcode:
IMG := TImage.Create(MyRect);
MakeBMPInhalt(bla bla bla); // Setzt nach der Berechnung auch die Höhe des Images

if MyRect.Height < IMG.Position.Y+IMG.Height then
  MyRect.Height := IMG.Position.Y+IMG.Height+2;

IMG.Parent := MyRect;
IMG.Position.X := LeftFromDatenbank;
IMG.Position.Y := TopFromDatenbank;
Und schon stimmen alle Koordinaten und beim "IMG.Parent" wird die Grafik gemäß Retina Auflösung skaliert!!! Macht alles unscharf.

Jetzt stehe ich vor dem Huhn/Ei Problem. Ich kann die Höhe des TRectangle nicht vorher setzen, da die erst berechnet werden muss... Ich muss aber das IMG vorher zuweisen, damit im nachhinein nicht eine Skalierung durchgeführt wird...

Ich werde weiter testen...

Mavarik

Daniel 12. Nov 2013 15:14

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols
 
Und wenn Du vom Image die Eigenschaft MultiResBitmap nutzt? Dann solltest Du ein natives Retina-Bitmap in voller Schärfe erstellen können. Zumindest mit meinen lokalen Bitmaps hier funktioniert das wie beschrieben und hat zudem die Flexibilität, auch die diversen Faktoren von Android zu unterstützen.

Mavarik 12. Nov 2013 15:31

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols
 
Zitat:

Zitat von Daniel (Beitrag 1235570)
Und wenn Du vom Image die Eigenschaft MultiResBitmap nutzt? Dann solltest Du ein natives Retina-Bitmap in voller Schärfe erstellen können. Zumindest mit meinen lokalen Bitmaps hier funktioniert das wie beschrieben und hat zudem die Flexibilität, auch die diversen Faktoren von Android zu unterstützen.

OK Damit habe ich mich noch nicht beschäftigt...

Aber ich habe eine Lösung gefunden gefunden:

1. IMG.WrapMode := TImageWrapMode.iwOriginal; // Fehlte! Voreingestellt ist iwFit
2. Vor einem "IMG.Parent := MyRect" MUSS ein IMG.Bitmap.Assign(BMP) passieren!

Sonst scheint das IMG für FMX nix zu sein, was man positionieren kann...

Übrigens:MyRecht.Height := 0; // War es nicht!

Jetzt noch die Skalierung rein und dann solle es funktionieren!

Mavarik

Union 12. Nov 2013 16:14

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols
 
Natürlich kann man das positionieren. Und Daniel hat Recht, Du solltest nicht TImage.Bitmap sondern
Delphi-Quellcode:
TImage.MultiResBitmap.Bitmaps[1]
verwenden. Und vom Assign unbedingt Absstand nehmen! Das dauert in voller Auflösung zwischen 3 (IPhone) - 6 (IPad) Sekunden. Also nur eine Referenz auf das Bitmap und direkt reinschreiben.

Allerdings passt sich die Größe des TImage meist auch nicht automatisch an das Bitmap an. Ob Du iwStretch, iWOriginal oder iWFit nimmst ist in dem Fall egal (ich verwende iwStretch).

Mavarik 12. Nov 2013 17:05

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols
 
Zitat:

Zitat von Union (Beitrag 1235585)
Natürlich kann man das positionieren. Und Daniel hat Recht, Du solltest nicht TImage.Bitmap sondern
Delphi-Quellcode:
TImage.MultiResBitmap.Bitmaps[1]
verwenden. Und vom Assign unbedingt Absstand nehmen! Das dauert in voller Auflösung zwischen 3 (IPhone) - 6 (IPad) Sekunden. Also nur eine Referenz auf das Bitmap und direkt reinschreiben.

Allerdings passt sich die Größe des TImage meist auch nicht automatisch an das Bitmap an. Ob Du iwStretch, iWOriginal oder iWFit nimmst ist in dem Fall egal (ich verwende iwStretch).

Zeitlich habe ich kein Problem! (Übrigens Funktioniert es mittlerweile super)
Ich erzeuge ca. 600 BMP's die ich mit Assign zuweise...

Kannst Du bitte mal "Also nur eine Referent auf das Bitmap und direkt reinschreiben" in Delphi formulieren... :stupid:

Mavarik

Union 12. Nov 2013 17:17

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols
 
Z.B. so:

Delphi-Quellcode:
FBitmap := Image1.MultiResBitmap.Bitmaps[1]; // Nur Referenz bilden, kein Create
FBitmap.Width := trunc(FTarget.Width*FScale + FBorderWidth * 2);
FBitmap.Height:= FBitmap.Width;
FBitmap.Canvas.BeginScene;
FBitmap.Canvas.StrokeThickness := 2;
FBitmap.Canvas.Font.Size  := FScale*CharHeight;
FBitmap.Canvas.Font.Style := [TFontStyle.fsBold];
FBitmap.Canvas.Fill.Kind  := TBrushKind.bkSolid;
FBitmap.Canvas.Stroke.Kind := TBrushKind.bkSolid;
FBitmap.Canvas.DrawRect(RectF(1,1,FBitmap.Width-2, FBitmap.Height-2), 0, 0, [], 1);
Zu Deinen bmp die Fragen:
  1. Welche Dimensionen haben diese?
  2. Hast Du das mal auf den physischen Geräten laufen lassen oder nur im Sim?

Mavarik 12. Nov 2013 18:11

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols
 
Zitat:

Zitat von Union (Beitrag 1235601)
Z.B. so:

Zu Deinen bmp die Fragen:
  1. Welche Dimensionen haben diese?
  2. Hast Du das mal auf den physischen Geräten laufen lassen oder nur im Sim?

Image1.MultiResBitmap.Bitmaps[1] <- 1?

Also "nur" TImage1.Create, oder?

Wenn ich 500 Images auf einer Scrollbox habe und habe z.B.
in MultiResBitmap 3 verschiedene Auflösungen...

z.B. 1, 2, 2,5 3

Und ich dann Scrollbox1.Scale.X := 2,5 setze, wird das ganze dann automatisch neu gerendert mit der "richtigen" Grafik?
Und was wenn ich Scale 2.3 setze?

Zu Deinen Fragen:
Die Images haben alle Größen zwischen 100x17 und 600x200.
Ich teste "nur" auf dem Device und nie im SIM. Aufbau dauert ca. 11 Sekunden auf einem iPad 3. Wäre schon, wenn ich das noch beschleunigen könnte.
Entwickelt wird auf Win32.

Mavarik

Union 12. Nov 2013 18:25

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols
 
Zitat:

Zitat von Mavarik (Beitrag 1235606)
in MultiResBitmap 3 verschiedene Auflösungen...

z.B. 1, 2, 2,5 3

Und ich dann Scrollbox1.Scale.X := 2,5 setze, wird das ganze dann automatisch neu gerendert mit der "richtigen" Grafik?
Und was wenn ich Scale 2.3 setze?

FMX sucht sich die am nächsten bei der Skalierung liegende Auflösung heraus. Das [1] deshalb, weil ich die Skalierung im Hintergrund selber vornehme sobald der Benutzer aufgehört hat zu zoomen und daher nur eine Bitmap habe. Die Zeitangaben basieren auf der maximalen Texturgröße der Hardware.

Mavarik 12. Nov 2013 18:31

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols
 
Zitat:

Zitat von Union (Beitrag 1235609)
Die Zeitangaben basieren auf der maximalen Texturgröße der Hardware.

Die Zeitangabe ist nicht messbar langsamer egal ob ich mit Factor 1, 2 oder 2,5 Rechne...

Jeweils Factor*ScreenFactor oben drauf...

Wenn ich also jedes IMG in drei Auflösungen hin legen will dann so?

BMP := Image1.MultiResBitmap.Bitmaps[0]; // 1x ohne Retina
BMP := Image1.MultiResBitmap.Bitmaps[1]; // 2x mit Retina
BMP := Image1.MultiResBitmap.Bitmaps[2]; // 4x für Zoom?

Richtig?

Mavarik


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz