Android Schiebeschalter [Toggle Switch]

    • Release
    • Open Source

    Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von mycell24.

      Android Schiebeschalter [Toggle Switch]

      Android 4.1+ Jelly Bean - Toggle Switch

      -------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      Hi liebe Community!


      Ich biete Euch hier ein Steuerelement, dass dem Android-Schiebeschalter in der reinen Android 4.1+ Jelly Bean Version ähnelt:



      -------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      Features:
      ✔ Umschalten per Mausklick auf das Control
      ✔ Umschalten per Verschiebung des ON/OFF-Schiebers
      ✔ Originalgetreue Farben von Android 4.1+ Jelly Bean
      ✔ Komplett anpassbares Design über die Eigenschaften

      -------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      Verwendete Programmiersprache(n) und IDE(s):
      Visual Basic .NET / IDE VB 2013 Professional

      Systemanforderungen:
      .Net Framework 4.0

      Lizenz/Weitergabe:
      OpenSource/ Erwähnung beim Namen nicht erforderlich, aber natürlich gern gesehen :saint:

      Danksagungen:
      Ein riesen Dankeschön geht an Murdock - Die Grundlage für ein Toggle Control 8-)

      -------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      Changelog:

      [V1.2]
      Neue Eigenschaft: ToggleImageON -> Zeichnet ein Bild anstatt dem Schieber
      Neue Eigenschaft: ToggleImageOFF -> Zeichnet ein Bild anstatt dem Schieber
      Neue Eigenschaft: Schriftart -> Legt die Schriftart fest, mit der auf dem Schieber gezeichnet wird

      [V1.1]
      Neue Eigenschaft: ColorON -> Legt die Farbe des Schiebers im "ON-Zustand" fest
      Neue Eigenschaft: ColorOFF -> Legt die Farbe des Schiebers im "OFF-Zustand" fest
      Neue Eigenschaft: TextON -> Legt den Text auf dem Schieber im "ON-Zustand" fest
      Neue Eigenschaft: TextOFF -> Legt den Text auf dem Schieber im "OFF-Zustand" fest
      Bearbeitete Eigenschaft: ForeColor -> Auswahl dieser Eigenschaft legt die Farbe des Textes fest
      Bearbeitete Eigenschaft: Font -> Auswahl dieser Eigenschaft wird nun vom Steuerelement übernommen (Schriftart, Größe, Art)

      -------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      ToDo:
      • Größe des Controls anpassen
      • Hover-Effekt beim berühren des Schiebers mit der Maus

      -------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      Falls Bugs bekannt sind, bitte mitteilen :)


      Viel Spaß mit dem Control!

      Ich warte auf Lob und Kritik :)

      MfG
      Dateien

      Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „TRiViUM“ ()

      Hi @TRiViUM!
      Erst ma ganz großes Lob! Super Control :D Werd es mit Sicherheit ma demnächst brauchen ;D

      Ich hätte da noch 2 Verbesserungsvorschläge:
      1.) in #66 bei denem Toggler_Click-Eventhandling: In deinem Original steht [tt[Handles Me.Click[/tt], VS korrigiert mich da uns schreibt, dass die Signaturen von Click(...) nicht mir MouseClick(...) übereinstimmen. => Wenn man Handles Me.MouseClick
      einfügt, geht alles gut
      2.)In gleichen Eventhandler schreibst du ne komplizierte If-Konstruktion...mach einfach
      If e.Button = Windows.Forms.MouseButtonLeft Then Checked = Not Checked Is ne ganz einfach Logische Konstruktion, spart Zeit, (Speicher)Platz und Nerven ;D

      Lg RAdinator
      In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
      @Linkai:
      Danke für Deine Rückmeldung :)
      Siehe ersten Post.

      @Radinator:
      Vielen Dank dafür :)
      VS hat mich da zwar nicht korrigiert, aber habs geändert :saint:
      Und die Vereinfachung von der If-Konstruktion habe ich ebenfalls so übernommen :)

      Siehe ersten Post für Änderungen und Download 8)

      MfG

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „TRiViUM“ ()

      TheVBNoob schrieb:



      Hier eine quick&dirty-Version, basierend auf der Logik des im Startposting veröffentlichten Beitrages (vielleicht kann der Themenersteller diese Version als Property mit einbauen ..):
      Spoiler anzeigen

      C#-Quellcode

      1. using System;
      2. using System.Windows.Forms;
      3. using System.Drawing;
      4. using System.ComponentModel;
      5. using System.Drawing.Drawing2D;
      6. namespace AndroidSwitch
      7. {
      8. [DefaultEvent("CheckedChanged")]
      9. class Toggler : Control
      10. {
      11. private Thumb T;
      12. private int Diff;
      13. private bool IsMouseDown, _checked;
      14. public event CheckedChangedEventHandler CheckedChanged;
      15. public delegate void CheckedChangedEventHandler(object sender);
      16. public bool Checked
      17. {
      18. get { return _checked; }
      19. set
      20. {
      21. if (value)
      22. T.Rect.X = Width - T.Width;
      23. else
      24. T.Rect.X = 2;
      25. if (_checked != value)
      26. _checked = value;
      27. if (CheckedChanged != null)
      28. CheckedChanged(this);
      29. Invalidate();
      30. }
      31. }
      32. private Color _ToggleColorON = Color.FromArgb(126, 199, 192);
      33. public Color ToggleColorON
      34. {
      35. get { return _ToggleColorON; }
      36. set
      37. {
      38. _ToggleColorON = value;
      39. Invalidate();
      40. }
      41. }
      42. private Color _ToggleColorOFF = Color.FromArgb(106, 160, 157);
      43. public Color ToggleColorOFF
      44. {
      45. get { return _ToggleColorOFF; }
      46. set
      47. {
      48. _ToggleColorOFF = value;
      49. Invalidate();
      50. }
      51. }
      52. public Toggler()
      53. : base()
      54. {
      55. // Set styles
      56. this.SetStyle(
      57. ControlStyles.AllPaintingInWmPaint |
      58. ControlStyles.ResizeRedraw |
      59. ControlStyles.UserPaint |
      60. ControlStyles.OptimizedDoubleBuffer, true);
      61. MouseClick += Toggler_Click;
      62. MouseUp += Toggler_MouseUp;
      63. MouseMove += Toggler_MouseMove;
      64. MouseDown += Toggler_MouseDown;
      65. SizeChanged += Toggler_SizeChanged;
      66. BackColor = Color.FromArgb(56, 67, 73);
      67. Width = 120;
      68. Height = 30;
      69. T = new Thumb(Width / 2, Height);
      70. }
      71. protected override void OnPaint(PaintEventArgs e)
      72. {
      73. base.OnPaint(e);
      74. e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
      75. Pen pen = new Pen(Color.FromArgb(77, 107, 109), e.ClipRectangle.Height - e.ClipRectangle.Height / 2);
      76. pen.StartCap = LineCap.Round;
      77. pen.EndCap = LineCap.Round;
      78. e.Graphics.DrawLine(pen, e.ClipRectangle.Width / 4, e.ClipRectangle.Height / 2, e.ClipRectangle.Width - e.ClipRectangle.Width / 4, e.ClipRectangle.Height / 2);
      79. T.DrawThumb(e.Graphics, Check(), _ToggleColorON, _ToggleColorOFF);
      80. }
      81. private void Toggler_SizeChanged(object sender, EventArgs e)
      82. {
      83. T = new Thumb(Width / 2, Height);
      84. if (Checked)
      85. T.Rect.X = Width - T.Width;
      86. }
      87. private void Toggler_MouseDown(object sender, MouseEventArgs e)
      88. {
      89. if (e.Button == MouseButtons.Left && T.Rect.IntersectsWith(new Rectangle(e.Location.X, e.Location.Y, 1, 1)))
      90. {
      91. Diff = e.Location.X - T.Rect.X;
      92. IsMouseDown = true;
      93. }
      94. }
      95. private void Toggler_MouseMove(object sender, MouseEventArgs e)
      96. {
      97. if (IsMouseDown)
      98. {
      99. T.Rect.X = e.Location.X - Diff;
      100. Invalidate();
      101. }
      102. }
      103. private void Toggler_MouseUp(object sender, MouseEventArgs e)
      104. {
      105. Checked = Check();
      106. IsMouseDown = false;
      107. }
      108. private void Toggler_Click(object sender, MouseEventArgs e)
      109. {
      110. if (e.Button == MouseButtons.Left)
      111. Checked = !Checked;
      112. }
      113. private bool Check()
      114. {
      115. if (Checked)
      116. {
      117. if (T.Rect.X <= Width / 4)
      118. return false;
      119. else
      120. return true;
      121. }
      122. else
      123. {
      124. if (T.Rect.X >= Width / 4)
      125. return true;
      126. else
      127. return false;
      128. }
      129. }
      130. private class Thumb
      131. {
      132. public int Width, Height;
      133. public Rectangle Rect;
      134. public Thumb(int width, int height)
      135. {
      136. this.Width = width;
      137. this.Height = height;
      138. Rect = new Rectangle(2, 2, width - 2, height - 4);
      139. }
      140. public void DrawThumb(Graphics g, bool drawChecked, Color _ColorON, Color _ColorOFF)
      141. {
      142. g.SmoothingMode = SmoothingMode.AntiAlias;
      143. g.FillEllipse(new SolidBrush((drawChecked) ? _ColorON : _ColorOFF), (Rect.X + Rect.Width / 2) - (Rect.Height / 2), Rect.Y - 1, Rect.Height, Rect.Height);
      144. }
      145. }
      146. }
      147. }



      Dateien
      • AndroidSwitch.zip

        (5,65 kB, 178 mal heruntergeladen, zuletzt: )
      Kannst mir ja schon mal helfen:
      Dein Schieber (Thumb) lässt sich nämlich ins unendliche nach links bzw. rechts verschieben :D
      Also quasi einen Anschlag für die Kugel basteln :)

      Desweiteren ist mir aufgefallen, dass bei dem JellyBean Toggler das Abrunden der Kanten unten nicht 100%ig funktioniert.
      Weißt du auf die schnelle, was da los ist?
      Ich meinte wenn man den Schalter benutzt, dann wird bei Start des Programmes sofort die Anweisung unter

      VB.NET-Quellcode

      1. If Android_Stock_ToggleSwitch1.Checked = True Then
      2. Label4.ForeColor = Color....


      ausgeführt. Wenn ich aber nicht nur eine Textfarbe ändern will, sondern nachfolgend etwas ausführen möchte schaltet der Android Toggle sofort nach Start schon mal auf "OFF". Ich habe das jetzt mit If Then Else gelöst.

      VB.NET-Quellcode

      1. If Android_Stock_ToggleSwitch1.Checked = True Then
      2. Label4.ForeColor = Color.Crimson
      3. If Counter = 0 Then
      4. Counter = Counter + 1
      5. Else
      6. "Einfügen was der Schalter machen soll bei off"
      7. End If
      8. Else
      9. Label4.ForeColor = Color.LimeGreen
      10. "Einfügen was der Schalter machen soll bei on"
      11. End If