AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung iOS Unterschiedliches verhalten (FMX) Rendern von Childcontrols
Thema durchsuchen
Ansicht
Themen-Optionen

Unterschiedliches verhalten (FMX) Rendern von Childcontrols

Ein Thema von Mavarik · begonnen am 12. Nov 2013 · letzter Beitrag vom 12. Nov 2013
Antwort Antwort
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#1

Unterschiedliches verhalten (FMX) Rendern von Childcontrols

  Alt 12. Nov 2013, 15:57
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
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols

  Alt 12. Nov 2013, 16:14
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols

  Alt 12. Nov 2013, 16:31
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols

  Alt 12. Nov 2013, 17:14
Natürlich kann man das positionieren. Und Daniel hat Recht, Du solltest nicht TImage.Bitmap sondern 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).
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols

  Alt 12. Nov 2013, 18:05
Natürlich kann man das positionieren. Und Daniel hat Recht, Du solltest nicht TImage.Bitmap sondern 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...

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols

  Alt 12. Nov 2013, 18:17
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?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols

  Alt 12. Nov 2013, 19:11
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols

  Alt 12. Nov 2013, 19:25
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Unterschiedliches verhalten (FMX) Rendern von Childcontrols

  Alt 12. Nov 2013, 19:31
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 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