Плавное изменение цвета контрола - Visual Basic .NET
Формулировка задачи:
Ребят, столкнулся с проблемой. Написал код для плавного изменения цвета(Уж как умею), но он работает криво, немного мерцает и цвета резко меняются. Наведите, пожалуйста, на путь истинный. Код:
Листинг программы
- Public Class ColorSwitcher
- Private T As Timer
- Private MyControl As Control
- Private CR, CG, CB As Integer
- Private FCR, FCG, FCB As Integer
- Private FinColor As Color
- Private ByStep As Integer
- Public Sub New(ByVal MyControl As Control, ByVal FinColor As Color, ByVal Optional ByStep As Integer = 1, ByVal Optional Interval As Integer = 1000)
- CR = MyControl.BackColor.R
- CG = MyControl.BackColor.G
- CB = MyControl.BackColor.B
- FCR = FinColor.R
- FCG = FinColor.G
- FCB = FinColor.B
- Me.ByStep = ByStep
- Me.MyControl = MyControl
- Me.FinColor = FinColor
- T = New Timer()
- AddHandler T.Tick, AddressOf T_Tick
- T.Interval = Interval
- T.Start()
- End Sub
- Private Sub T_Tick(sender As Object, e As EventArgs)
- Select Case MyControl.BackColor.R
- Case < FinColor.R
- CR += ByStep
- If CR + ByStep > FCR Then CR = FCR
- Case > FinColor.R
- CR -= ByStep
- If CR - ByStep < FCR Then CR = FCR
- End Select
- Select Case MyControl.BackColor.G
- Case < FinColor.G
- CG += ByStep
- If CG + ByStep > FCG Then CG = FCG
- Case > FinColor.G
- CG -= ByStep
- If CG - ByStep < FCG Then CG = FCG
- End Select
- Select Case MyControl.BackColor.B
- Case < FinColor.B
- CB += ByStep
- If CB + ByStep > FCR Then CB = FCB
- Case > FinColor.B
- CB -= ByStep
- If CB - ByStep < FCB Then CB = FCB
- End Select
- MyControl.BackColor = Color.FromArgb(CR, CG, CB)
- If CR = FCR And CG = FCG And CB = FCB Then sender.Stop()
- End Sub
- End Class
Решение задачи: «Плавное изменение цвета контрола»
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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д