![]() |
Leanback
Ich wollte mich seit längerem wieder mit Firemonkey beschäftigen und ein Grid-View ähnlich wie die Leanback Effekte bei Amazon Prime, Netflix oder Android TV umsetzen.Also im Endeffekt so etwas:
![]() Versteht mich nicht falsch, es ist jetzt nicht so dass ich das nicht in einer eigenen Klasse (basierend auf TControl) selber umsetzen kann und ich fürchte ich komme da nicht drum herum, aber prinzipiell sollte das doch auch mit Bordmitteln gehen? Mein Ansatz war ein quadratisches TRectangle mit XRadius,YRadius von 10 Pixeln als Basis. Das Hintergrundbild in den Fill Brush und noch ein TRectangle als Child unten in dem eigentlichen Rechteck, wo dann der Text eingezeichnet wird. Das erste Problem ist, dass in dem Child-Rechteck nicht die unteren Ecken beschnitten werden. ClipChildren ist natürlich gesetzt. Danach habe ich ein TShadowEffect auf das Basisrechteck gelegt. Mit FloatAnimation ändere ich Scale.X und Scale.Y und Position.X und .Y, da ich sowas wie Zoom nicht gefunden habe. Beim Zoomen gibt es jetzt aber Probleme mit TShadowEffect, da der den Schatten irgendwie nachzieht. Spaßeshalber habe ich das ganze mal auf einem Mac gestartet und autsch ist das quälend lahm. Wohlgemerkt ich hab bis jetzt nur ein Tile und von den weiteren Animationen will ich noch gar nicht reden. Wie würdet ihr das machen? Peter |
AW: Leanback
Helfen kann ich nicht, aber würde gerne (nur Interesse halber) mal sehen, wie weit Du bist und wie weit Du kommst.
Falls Du einen Screenrecorder (und Zeit und Lust) hast, wäre mal ein kurzes Video nett... |
AW: Leanback
Liste der Anhänge anzeigen (Anzahl: 2)
Klar gerne,
anbei der Quellcode zu dem Test. Die Idee ist, dass ich ein eigenes Control habe in dem das gewünschte Bild und der Text gespeichert ist. Diesen rendere ich entweder in eine Bitmap, oder über Paint auf die Anzeige. Für das Scrollen werde ich dann je nach Rubrik verschiedene PresentedScrollbox Container verwenden. Vielleicht hast du ja eine Idee, wie ich zu dem gewünschten Element scrolle. Für das Vergrößern des ausgewählten Elements würde ich TAnimationFloat verwenden, aber mir missfällt da für Position.X, Y und Width, Height in Summe 4 TAnimationFloat Klassen zu erstellen. Die Panels mit unserer Bundeskanzlerin habe ich nur als Referenz drin. Idee ist es dass im Fokus befindliche Textfeld mit #FF0096A6 im ausgewählten und #FF0096A6 im nicht ausgewählten Zustand darzustellen. Ich habe das ganze mal als Mockup in einem Grafikprogramm zusammengestellt. Peter |
AW: Leanback
Danke, anschauen kann ich das erst heute Abend zu Hause.
Zu FMX kann ich nichts sagen. Habe ich vor ein paar Jahren aufgegeben. Ich arbeite an einer eigenen GUI (derzeit allerdings unterbrochen), die auch Ebenen unterstützen soll. Hier mal eine Demo, wie das aussieht: ![]() (Die herausgehobenen Zellen machen so natürlich keinen Sinn, aber in ähnlicher Weise wird das funktionieren, wenn man eine Spalte verschiebt -> Spalte hochheben, schieben, fallen lassen.) |
AW: Leanback
Helfen kann ich Dir da leider nicht.
Aber ich würde die Animationen nach Möglichkeit etwas verlangsamen, so dass eine Markierung ca. eine halbe oder dreiviertel Sekunde dauert. Im FMX konnte man ja so etwas m.E. ganz einfach einstellen. |
AW: Leanback
Hallo,
ich habe heute mal etwas Zeit gehabt mit Firemonkey zu spielen. Folgender Code erstellt 11 bunte Tiles die, wenn Sie den Focus bekommen animiert sich vergrößern bzw. verkleinern. Das funktioniert auf allen Plattformen, sowohl via Touch, als auch mit Tastatur. Mein Problem ist, dass ich nicht weiß wie man die Scrollbox möglichst angenehm auf den fokussierten Eintrag anpasst. Hat da jemand eine Idee? Das ist so ziemlich das einzigste Problem was ich an dem Code noch habe. Aktuell lade ich in einem Thread die Grafiken habe mehrere Scrollboxen als Rubriken untereinander. Lediglich das horizontale und vertikale scrollen bekomme ich schlichtweg nicht hin.
Delphi-Quellcode:
unit UMain;
interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts; type TTileItem = class(TControl) protected FZoomFactor: Single; FBackgroundColor: TAlphaColor; procedure Paint; override; procedure DoEnter; override; procedure DoExit; override; procedure SetZoomFactor(AValue: Single); procedure SetBackgroundColor(AValue: TAlphaColor); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property BackgroundColor: TAlphaColor read FBackgroundColor write SetBackgroundColor; property ZoomFactor: Single read FZoomFactor write SetZoomFactor; end; TForm3 = class(TForm) HorzScrollBox1: THorzScrollBox; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form3: TForm3; implementation uses FMX.Ani; {$R *.fmx} const cZoomIn = 0.9; cZoomOut = 1.0; cZoomTime = 0.4; constructor TTileItem.Create(AOwner: TComponent); begin inherited; CanFocus := true; ZoomFactor := 0; FBackgroundColor := TAlphaColors.Gray; end; destructor TTileItem.Destroy; begin inherited; end; procedure TTileItem.DoEnter; begin BringToFront; TAnimator.AnimateFloat(self, 'ZoomFactor', cZoomOut, cZoomTime, TAnimationType.Out, TInterpolationType.Quartic); end; procedure TTileItem.DoExit; begin SendToBack; TAnimator.AnimateFloat(self, 'ZoomFactor', cZoomIn, cZoomTime, TAnimationType.Out, TInterpolationType.Quartic); end; procedure TTileItem.SetBackgroundColor(AValue: TAlphaColor); begin if FBackgroundColor <> AValue then begin FBackgroundColor := AValue; repaint; end; end; procedure TTileItem.SetZoomFactor(AValue: Single); begin if AValue < cZoomIn then AValue := cZoomIn; if AValue > cZoomOut then AValue := cZoomOut; if FZoomFactor <> AValue then begin FZoomFactor := AValue; repaint; end; end; procedure TTileItem.Paint; var w, h: Single; R: TRectF; begin if Locked then Exit; w := Width * FZoomFactor; h := Height * FZoomFactor; R := RectF((Width - w) / 2, (Height - h) / 2, w, h); Canvas.Fill.Color := FBackgroundColor; Canvas.FillRect(R, 5, 5, AllCorners, AbsoluteOpacity); end; const ModernUIColors: Array [0 .. 10] of TAlphaColor = ($FFFF0097, $FF1BA1E2, $FFA200FF, $FF00ABA9, $FF8CBF26, $FFA05000, $FFE671B8, $FFF09609, $FFE51400, $FF339933, $FFFFFFFF); procedure TForm3.FormCreate(Sender: TObject); var i: integer; w, h: Single; item: TTileItem; begin w := 150; h := HorzScrollBox1.Height - 20; for i := 0 to high(ModernUIColors) do begin item := TTileItem.Create(self); with item do begin BackgroundColor := ModernUIColors[i]; Parent := HorzScrollBox1; Position.Point := PointF(i * 0.9 * w, 0); Width := w; Height := h; end; end; end; end. |
AW: Leanback
Hallo Peter,
bin icht ganz sicher was genau Du erreichen willst. Aber das Scrollen bekomment man durch die InteractiveGestures aktiviert. Im HorizScrollBox Object-Inspektor unter Touch\InteractiveGestures\Zoom diese Checkbox setzen. Dann kann man den Eventhandler hinzufügen, z.B. so
Delphi-Quellcode:
procedure TForm3.HorzScrollBox1Gesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); var LScrollBox: TCustomScrollBox; LScaleNew: Single; begin if not (Sender is TCustomScrollBox) then Exit; if EventInfo.GestureID = igiZoom then begin LScrollBox := Sender as TCustomScrollBox; if not(TInteractiveGestureFlag.gfBegin in EventInfo.Flags) then begin LScaleNew := ( (LScrollBox.ClientWidth + EventInfo.Distance - FLastDIstance) / LScrollBox.ClientWidth); LScrollBox.Scale.X := LScrollBox.Scale.X * LScaleNew; LScrollBox.RealignContent; end; FLastDIstance := EventInfo.Distance; end; end; |
AW: Leanback
Danke,
ich wollte, wenn ich auf einen Eintrag mit Tab bzw. Shift+Tab gehe, dass dieser selektierte Eintrag in der Scrollbox den Fokus bekommt. So etwas wie bei einer Liste bei der ich über ScrollTo zu dem gewählten Element scrolle. Und dass möglichst animiert :) Peter |
AW: Leanback
Das mach es ja so, es zoomed einen Block bei Click größer, und man kann das Ganze dann noch manuell zoomen.
|
AW: Leanback
Liste der Anhänge anzeigen (Anzahl: 1)
Danke,
aber ich stehe ein bisschen auf dem Schlauch. Ich möchte im Prinzip das aktive Tile in der Scrollbox fokussieren. Wahlweise über anklicken, scrollen oder mittels Links/Rechts. Ich habe mal den Testcode an den Post gehängt. Peter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz