Плавное изменение цвета контрола - Visual Basic .NET
Формулировка задачи:
Ребят, столкнулся с проблемой. Написал код для плавного изменения цвета(Уж как умею), но он работает криво, немного мерцает и цвета резко меняются. Наведите, пожалуйста, на путь истинный. Код:
Решение задачи: «Плавное изменение цвета контрола»
textual
Листинг программы
Public Class Form1
Private _timer As Timer 'таймер для анимации
Private _ratio As Single 'соотношение смешивания
Private _onBlend As Boolean 'для анимации. Определяет сторону смешивания
'цвета между которыми происходит переход
Private _colorA As Color = Me.BackColor
Private _colorB As Color = Color.BlueViolet
Public Sub New()
InitializeComponent()
'Me.DoubleBuffered = True ' если форма мерцает
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
_onBlend = Not _onBlend 'работает как переключатель смешивания. можно использовать не дожидаясь конца анимации
Me.StartAnimate()
End Sub
'подготовка и запуск таймера
Public Sub StartAnimate()
If _timer Is Nothing Then
_timer = New Timer()
_timer.Interval = 20 ' 20 * 1/0.1 = 200 мс. Минимальное время анимации
AddHandler _timer.Tick, AddressOf Animate
_timer.Start()
End If
End Sub
'вызов функции анимации при каждом такте таймера
Public Sub Animate(sender As Object, e As EventArgs)
If _onBlend Then
_ratio += 0.1F
If _ratio >= 1.0F Then
_ratio = 1.0F
_timer.Stop()
_timer.Dispose()
_timer = Nothing 'что бы убедить StartAnimate() что таймер не запущен
End If
Else
_ratio -= 0.1F
If _ratio <= 0.0F Then
_ratio = 0.0F
_timer.Stop()
_timer.Dispose()
_timer = Nothing
End If
End If
Me.BackColor = GetBlendColor(_colorA, _colorB, _ratio)
End Sub
Public Shared Function GetBlendColor(ColorA As Color, ColorB As Color, Ratio As Single)
'If Ratio < 0.0F Or Ratio > 1.0F Then 'для контроля, если используете в других функциях.
' Throw New OverflowException("Значение должно быть в пределах от 0.0 до 1.0")
'End If
Return Color.FromArgb(ColorA.R + (CInt(ColorB.R) - ColorA.R) * Ratio, _
ColorA.G + (CInt(ColorB.G) - ColorA.G) * Ratio, _
ColorA.B + (CInt(ColorB.B) - ColorA.B) * Ratio)
End Function
'такая структура позволяет не останавливая анимацию переключать сторону смешивания
End Class