Плавное изменение цвета контрола - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5
Похожие ответы