Animated toggle switch

Rund um die LCL und andere Komponenten
Antworten
wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Animated toggle switch

Beitrag von wennerer »

Hallo,
nachdem wp in einem anderem Beitrag (viewtopic.php?p=138001#p138001) diesen klasse Code zum Drehen einer PNG gepostet hat ist mir der ToggleSwitch wieder eingefallen und ich musste einfach mal herumprobieren was ich da mit meinen bescheidenen Mitteln zu Wege bringe. Das was ich unten angehängt habe ist natürlich noch lange keine brauchbare Komponente, dennoch würde mich interessieren wie die Meinungen dazu sind bzw. ob man die Grafik mit einfachen Tricks noch verbessern könnte. Was mir auch aufgefallen ist, ist das es unter Linux viel schneller läuft als unter Windows (gleicher Laptop).
TestASwitch.png
TestASwitch.png (5.4 KiB) 2970 mal betrachtet
Ich hoffe ich habe keinen Fehler beim Zusammenstellen der benötigten Dateien (Ressourcen) gemacht.

Viele Grüße
Bernd

Edit: Anhang nochmal getauscht, siehe Beitrag Fliegermichl
Dateianhänge
project1.zip
(76.16 KiB) 50-mal heruntergeladen
Zuletzt geändert von wennerer am Di 14. Nov 2023, 18:56, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Animated toggle switch

Beitrag von wp_xyz »

Schöne Idee. Allerdings sehen die Ränder infolge der Farbtransparenz nicht so toll aus. In der Anlage eine überarbeitete Version, für die ich die Bilder mit Inkscale als svg überarbeitet, mit einem Hintergrund versehen und dann als png exportiert haben. Im Code wird dann der Alpha-Kanal verwendet, statt der "TransparentColor". Außerdem habe ich die Anzahl der Umwandlungen zwischen LCL-Graphik und FCL-Image reduziert..
Dateianhänge
animated_toggle_switch_wp.zip
(13.19 KiB) 69-mal heruntergeladen
animated_toggle_switch_wp.png
animated_toggle_switch_wp.png (5.78 KiB) 2962 mal betrachtet

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Animated toggle switch

Beitrag von wennerer »

Wow, sieht super aus!
Vielen Dank für deine Antwort. Ich muss wie immer erstmal verstehen was du alles gezaubert hast.
Dauert bei mir immer etwas, aber der Winter steht ja vor der Tür.

Viele Grüße
Bernd

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Animated toggle switch

Beitrag von theo »

Sieht gut aus!
Wenn''s jetzt noch ein Control wäre... :wink:

Benutzeravatar
KodeZwerg
Beiträge: 103
Registriert: Mo 6. Feb 2023, 11:04

Re: Animated toggle switch

Beitrag von KodeZwerg »

theo hat geschrieben:
Di 14. Nov 2023, 09:19
Sieht gut aus!
Wenn''s jetzt noch ein Control wäre... :wink:
Dem stimme ich zu und eine mini Verbesserung wäre auch den Rot/Grün Farbwechsel mehr als blending anstelle "hälfte erreicht, spontan wechsel", würde besser zum rest passen find ich.
Gute arbeit wp_xy!
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Benutzeravatar
KodeZwerg
Beiträge: 103
Registriert: Mo 6. Feb 2023, 11:04

Re: Animated toggle switch

Beitrag von KodeZwerg »

So wird es hübsch aufgewertet finde ich.

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
const
  TWO_PI = 2.0 * pi;
var
  x0, y0: Integer;
  imgEXIT, imgOK, imgRed, imgGreen: TLazIntfImage;
  bmp: TBitmap;
  f: Double;
begin
  x0 := 20;
  y0 := 20;
  f := FSliderPos / FSliderRange;
  {
    if FSliderPos > FSliderRange div 2 then
      Canvas.Draw(x0, y0, FImages[1])
    else
      Canvas.Draw(x0, y0, FImages[0]);
  }
  bmp := TBitmap.Create;
  try
    imgRed := FImages[0].CreateIntfImage;
    imgGreen := FImages[1].CreateIntfImage;
    BlendImages(imgGreen, imgRed, 1.0 - f);
    bmp.Pixelformat := pf32Bit;
    bmp.Assign(imgGreen);
    Canvas.Draw(x0, y0, bmp);
  finally
    bmp.Free;
    imgRed.Free;
    imgGreen.Free;
  end;

  imgExit := FImages[2].CreateIntfImage;
  imgOK := FImages[3].CreateIntfImage;
  bmp := TBitmap.Create;
  try
    BlendImages(imgOK, imgEXIT, 1.0 - f);
    if FRoll then
      RotateImage(imgOK, TWO_PI * f);

    bmp.Pixelformat := pf32Bit;
    bmp.Assign(imgOK);

    Canvas.Draw(x0 + FMargin + FSliderPos, y0 + FMargin, bmp);
  finally
    bmp.Free;
    imgOK.Free;
    imgExit.Free;
  end;
end;
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Animated toggle switch

Beitrag von fliegermichl »

Ich hatte das Testprojekt heruntergeladen und mit Lazarus geöffnet. Da meckert es, daß es das Package Multis nicht finden kann. Wenn man die Abhängigkeit aus dem Projektinspektor entfernt, kompiliert es aber problemlos.

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Animated toggle switch

Beitrag von wennerer »

Hallo,

Fliegermichl schrieb:
Ich hatte das Testprojekt heruntergeladen und mit Lazarus geöffnet. Da meckert es, daß es das Package Multis nicht finden kann. Wenn man die Abhängigkeit aus dem Projektinspektor entfernt, kompiliert es aber problemlos.
Danke für deinen Hinweis. Keine Ahnung wie ich das reingebracht habe. Da muss ich in Zukunft besser aufpassen, ist nervig wenn es nicht läuft. Ich habe den Anhang nochmal getauscht.

KodeZwerg schrieb:
So wird es hübsch aufgewertet finde ich.
Ja finde ich auch.

Theo schrieb:
Wenn''s jetzt noch ein Control wäre... :wink:
Also ich werde da bestimmt bei Gelegenheit weiter herumprobieren. Und wer weiß ... manchmal findet auch ein blindes Huhn ein Korn. :lol:
Aber eventuell finden sich ja noch mehr denen der vorhandene Code sogut gefällt das er was daraus machen möchte.

Viele Grüße an Alle!
Bernd

Benutzeravatar
KodeZwerg
Beiträge: 103
Registriert: Mo 6. Feb 2023, 11:04

Re: Animated toggle switch

Beitrag von KodeZwerg »

theo hat geschrieben:
Di 14. Nov 2023, 09:19
Wenn''s jetzt noch ein Control wäre... :wink:
Vielleicht dient das als Vorlage für ein Control?
Es bietet alles was in wp's original vorkommt.
Es ist ein Control.
Es hat die gleiche Macke wie mein anderes "Rotieren"-Control, es zeichnet nicht transparent, da die ecken rund sind ist in diesem kleinen Randbereicht ein Fehler zu sehen wenn man ein Bild oder einen Farbverlauf im Hintergrund hat.
Es hat noch den einen oder anderen Schönheitsfehler, einer zum Beispiel ist, das erst nach dem zweiten Klick-Event etwas passiert.

Als demo ist das original von wp mit dem control zusammen.
Dateianhänge
wp_ToggleSwitch.zip
(19.49 KiB) 44-mal heruntergeladen
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Animated toggle switch

Beitrag von wp_xyz »

Ich habe jetzt mal den TOnOffSwitch aus dem Industrial-Package auf CCR um ein Animation-Feature erweitert, sowie um eine ImageList für die Icons, die auf dem Button im ON/OFF-Zustand gemalt werden können.

Der runde Stil ist wegen des Malens auf dem LCL-canvas recht pixelig. Aber ich weiß nicht recht, wie man das besser machen kann, denn in dem Beispiel weiter oben wurde ein PNG-Hintergrundbild verwendet, aber das passt hier nicht, weil ich die Größe des Controls einstellbar lassen möchte.

Das beigefügte Projekt erlaubt, mit der Komponente herumzuspielen. Die entsprechende switches-Unit ist gleich mit dabei, man muss also nichts installieren. Aber ansonsten befindet sich die Unit im Industrial-Package auf CCR (https://sourceforge.net/p/lazarus-ccr/s ... rialstuff/). Das ganze kommt später auch in den OPM, muss sich aber erst noch "setzen".

[EDIT] Den zip-Anhang gegen eine mit Laz-Release compilierbare Version ausgetauscht.
Dateianhänge
onoffswitch.png
onoffswitch.png (24.66 KiB) 2840 mal betrachtet
onoffswitch_animation.zip
(11.32 KiB) 57-mal heruntergeladen
Zuletzt geändert von wp_xyz am Mi 15. Nov 2023, 10:40, insgesamt 4-mal geändert.

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Animated toggle switch

Beitrag von sstvmaster »

Hallo wp,

bekomme folgende Meldung;

Code: Alles auswählen

switches.pas(259,14) Error: Identifier not found "RotatePoint"
VG Maik

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Animated toggle switch

Beitrag von wp_xyz »

sstvmaster hat geschrieben:
Mi 15. Nov 2023, 07:54
switches.pas(259,14) Error: Identifier not found "RotatePoint"
VG Maik
Mist, habe nicht dran gedacht, dass RotatePoint mindestens Laz3.0 benötigt. Habe nun den Anhang oben gegen eine funktionierende Version ausgetauscht.

Benutzeravatar
KodeZwerg
Beiträge: 103
Registriert: Mo 6. Feb 2023, 11:04

Re: Animated toggle switch

Beitrag von KodeZwerg »

Danke für dein Control wp_xyz.
Es hat leider den gleichen Fehler wie meins, zumindest unter Windows, es zeichnet nicht Transparent.
Im Anhang zeige ich wie ich es meine.
Bild_2023-11-15_110910842.png
Bild_2023-11-15_110910842.png (26.37 KiB) 2835 mal betrachtet
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Animated toggle switch

Beitrag von wp_xyz »

Hätte schören können, dass ich das ausprobiert habe - warum ist dann das mit dem WMEraseBkGnd im Code? Aber wahrscheinlich hat das nicht funktioniert, und ich hab's dann vergessen...

Jedenfalls, wenn man etwas sucht, dann kommt man auf TControl.SetShape(ABitmap), und damit funktioniert es. Tausche die switches-Unit gegen die Version im Anhang aus.
Dateianhänge
onoffswitch-1.png
onoffswitch-1.png (24.64 KiB) 2812 mal betrachtet
switches.pas
(30.96 KiB) 57-mal heruntergeladen

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Animated toggle switch

Beitrag von wennerer »

Hallo wp_xyz,
ich habe es eben mal getestet. Ich finde bsThinRounded schaut ohne Abstriche absolut brauchbar aus. Die Animation ist super. Und eventuell sind wir auch etwas zu kritisch. ich habe heute mal bewusst in einigen Programmen ähnliche Controlls betrachtet und muss sagen da schaut dein OnOffSwitch um Welten besser aus.


Viele Grüße
Bernd

Antworten