Ich bin im Moment sehr beschäftigt, aber wollte euch eine Kleinigkeit zur Verfügung stellen.
Guck auf die Animation und du siehst was du kriegst.
Du kannst jeden Hintergrund eines Steuerelements animieren, setze einfach die Hintergrundfarbe am Anfang auf rot.
Sowohl der Ablauf, als auch die Stopanimation läuft flüssig.
Wichtig: Benutze keinen transparencykey auf eurer Form, sonst wird das für eine Farbenframe komisch aussehen.
Schlechter Beispielcode
Code:
Guck auf die Animation und du siehst was du kriegst.
Du kannst jeden Hintergrund eines Steuerelements animieren, setze einfach die Hintergrundfarbe am Anfang auf rot.
Sowohl der Ablauf, als auch die Stopanimation läuft flüssig.
Wichtig: Benutze keinen transparencykey auf eurer Form, sonst wird das für eine Farbenframe komisch aussehen.
Schlechter Beispielcode
VB.NET-Quellcode
- Dim x, x2 As Threading.Thread
- Dim colorChangeTest As SmoothColorChangeAlgorithm
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- x = New Threading.Thread(AddressOf colorChangeTest.startChanging)
- x.Start()
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- x2 = New Threading.Thread(AddressOf colorChangeTest.stopChanging)
- x2.Start()
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- colorChangeTest = New SmoothColorChangeAlgorithm(Panel1, 0, SmoothColorChangeAlgorithm.switchSpeed.fast)
- End Sub
- Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
- Try
- x.Abort()
- x2.Abort()
- Catch
- End Try
- End Sub
Code:
VB.NET-Quellcode
- Public Class SmoothColorChangeAlgorithm
- #Region "Color table"
- Private colArray() As Color = New Color() {Color.FromArgb(255, 0, 0), _
- Color.FromArgb(255, 128, 0), _
- Color.FromArgb(255, 255, 0), _
- Color.FromArgb(128, 255, 0), _
- Color.FromArgb(0, 255, 0), _
- Color.FromArgb(0, 255, 128), _
- Color.FromArgb(0, 255, 255), _
- Color.FromArgb(0, 128, 255), _
- Color.FromArgb(0, 0, 255), _
- Color.FromArgb(128, 0, 255), _
- Color.FromArgb(255, 0, 255), _
- Color.FromArgb(255, 0, 128)}
- #End Region
- #Region "Helper"
- Private changeStop As Boolean
- Private changeDelay, sleepDelay, changeIndex As Integer
- Private target As Control
- Private swtSpd As switchSpeed = switchSpeed.fast
- Public Enum switchSpeed As Integer
- chilling = 50
- slow = 20
- normal = 10
- fast = 5
- End Enum
- Private Delegate Sub setColorDelegate(ByVal color As Color)
- Private Sub setColor(ByVal color As Color)
- target.BackColor = color
- End Sub
- #End Region
- #Region "Constructor"
- Public Sub New(ByVal target As Control)
- Me.target = target
- Me.sleepDelay = 2000
- Me.swtSpd = switchSpeed.normal
- End Sub
- Public Sub New(ByVal target As Control, ByVal sleepDelay As Integer)
- Me.target = target
- Me.sleepDelay = sleepDelay
- Me.swtSpd = switchSpeed.normal
- End Sub
- Public Sub New(ByVal target As Control, ByVal sleepDelay As Integer, ByVal switchSpeed As switchSpeed)
- Me.target = target
- Me.sleepDelay = sleepDelay
- Me.swtSpd = switchSpeed
- End Sub
- #End Region
- #Region "Core"
- Public Sub startChanging()
- changeStop = False
- setColor(colArray(0))
- changeIndex = 1
- Dim d As setColorDelegate = AddressOf setColor
- Do While changeStop = False
- Dim changeR, changeG, changeB As Single
- If target.BackColor.R < colArray(changeIndex).R Then
- changeR = -((colArray(changeIndex).R - target.BackColor.R) / 128)
- Else
- changeR = (target.BackColor.R - colArray(changeIndex).R) / 128
- End If
- If target.BackColor.G < colArray(changeIndex).G Then
- changeG = -((colArray(changeIndex).G - target.BackColor.G) / 128)
- Else
- changeG = (target.BackColor.G - colArray(changeIndex).G) / 128
- End If
- If target.BackColor.B < colArray(changeIndex).B Then
- changeB = -((colArray(changeIndex).B - target.BackColor.B) / 128)
- Else
- changeB = (target.BackColor.B - colArray(changeIndex).B) / 128
- End If
- For changeIndex As Integer = 1 To 127 Step 1
- Dim newR As Double = target.BackColor.R - changeR
- If newR > 255 Then
- newR += changeR + changeR
- End If
- Dim newg As Double = target.BackColor.G - changeG
- If newg > 255 Then
- newg += changeG + changeG
- End If
- Dim newb As Double = target.BackColor.B - changeB
- If newb > 255 Then
- newb += changeB + changeB
- End If
- If changeStop = True Then Exit Do
- Dim col As Color = Color.FromArgb(newR, newg, newb)
- d.BeginInvoke(col, Nothing, Nothing)
- Threading.Thread.Sleep(swtSpd)
- Next
- d.BeginInvoke(colArray(changeIndex), Nothing, Nothing)
- If changeStop = True Then Exit Do
- Threading.Thread.Sleep(sleepDelay)
- changeIndex += 1
- If changeIndex = 12 Then changeIndex = 0
- Loop
- End Sub
- Public Sub stopChanging()
- changeStop = True
- Dim d As setColorDelegate = AddressOf setColor
- Do While target.BackColor <> Color.Red
- Dim newR As Double = target.BackColor.R
- Dim newG As Double = target.BackColor.G
- Dim newB As Double = target.BackColor.B
- If newR < 255 Then
- newR += 1
- End If
- If newG > 0 Then
- newG -= 1
- End If
- If newB > 0 Then
- newB -= 1
- End If
- Dim col As Color = Color.FromArgb(newR, newG, newB)
- d.BeginInvoke(col, Nothing, Nothing)
- Threading.Thread.Sleep(swtSpd)
- Loop
- End Sub
- #End Region
- End Class