ich hab das kleine Beispielprogramm nochmal überarbeitet. es passt sich nun automatisch an die bildschirmbreite an. getestet auf windows, android und ios
es war etwas unangenehm, das hinzubekommen. ich musste tatsächlich die animationen in den frame verlegen, weil ich ansonsten unter android und ios keinen zufgriff auf die eigenschaften der im Stylebook liegenden Animationen erlangt habe.
Unter Windows hats ohne Probleme funktioniert (FindSytelRe, auf iOS und Android gabs erstmal nur auf Umwegen überhaupt zugriff und der wurde dann auch noch ignoriert. Für mein Gefühl ist das ein Bug im Stylebook. Ich habe versucht, zu ergründen, woran es scheitert, aber der debugger/die
ide ist dabei mehrfach abgestürzt, dann hatte ich irgendwann keine Lust mehr...
unter Windows, nicht aber unter iOS und Android funktionierte dieser Zugriff auf die Objekte im Stylebook:
Delphi-Quellcode:
var flani:TFloatAnimation;
flani:=StyleBook1.Style.FindStyleResource('OnShowSlideInLeft', False) as TFloatAnimation;
if Assigned(flani) then
flani.StartValue:=-(LayoutForMVFrameLeft.Width+5);
flani:=StyleBook1.Style.FindStyleResource('OnHideSlideOutLeft', False) as TFloatAnimation;
if Assigned(flani) then
flani.StopValue:=-(LayoutForMVFrameLeft.Width+5);
FindStyleResource lieferte unter iOS und Android nur für ganz wenige komponenten aus dem Stylebook einen Wert zurück, meistens aber nil. Die Elemente, die zu finden waren, lagen hierarchisch betrachtet eher oben, aber eine logik habe ich nicht entdeckt.
Das hier war der Ersatz für Android und iOS:
Delphi-Quellcode:
var flani:TFloatAnimation;
rctngl:TRectangle;
layout:TLayout;
i,j:integer;
//Workaround iOS/Android FindStyleResource: es werden nur weit oben stehende Komponenten sicher gefunden
layout:=StyleBook1.Style.FindStyleResource('LikeMultiViewLeft', false) as TLayout;
if Assigned(layout) then
begin
for i:=0 to layout.ChildrenCount-1 do
begin
if (layout.Children[i] is TRectangle) then
begin
if (layout.Children[i] as TRectangle).StyleName='RectangleContentBackgroundLeft' then
begin
rctngl:=(layout.Children[i] as TRectangle);
for j:=0 to rctngl.ChildrenCount-1 do
begin
if (rctngl.Children[j] is TFloatAnimation) then
begin
if (rctngl.Children[j] as TFloatAnimation).StyleName='OnShowSlideInLeft' then
begin
(rctngl.Children[j] as TFloatAnimation).StartValue:=-(LayoutForMVFrameLeft.Width+5);
end;
if (rctngl.Children[j] as TFloatAnimation).StyleName='OnHideSlideOutLeft' then
(rctngl.Children[j] as TFloatAnimation).StopValue:=-(LayoutForMVFrameLeft.Width+5);
end;
end;
end;
end;
end;
end;
aber leider brachte auch das keinen Erfolg. Zwar wurden die Werte tatsächlich überschrieben, aber die Animationen liefen weiterhin so ab, als wären noch die Originalwerte gesetzt. Das war schon verrückt...
wie gesagt, ob es an der TFramstand-Komponente oder an Delphi liegt, habe ich nicht erforscht.
Und weil das so verrückt war, fand ich es sinnig, die funktionierende Version hier nochmal zu posten