Плавное изменение цвета контрола - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Ребят, столкнулся с проблемой. Написал код для плавного изменения цвета(Уж как умею), но он работает криво, немного мерцает и цвета резко меняются. Наведите, пожалуйста, на путь истинный. Код:
Листинг программы
  1. Public Class ColorSwitcher
  2. Private T As Timer
  3. Private MyControl As Control
  4. Private CR, CG, CB As Integer
  5. Private FCR, FCG, FCB As Integer
  6. Private FinColor As Color
  7. Private ByStep As Integer
  8. Public Sub New(ByVal MyControl As Control, ByVal FinColor As Color, ByVal Optional ByStep As Integer = 1, ByVal Optional Interval As Integer = 1000)
  9. CR = MyControl.BackColor.R
  10. CG = MyControl.BackColor.G
  11. CB = MyControl.BackColor.B
  12. FCR = FinColor.R
  13. FCG = FinColor.G
  14. FCB = FinColor.B
  15. Me.ByStep = ByStep
  16. Me.MyControl = MyControl
  17. Me.FinColor = FinColor
  18. T = New Timer()
  19. AddHandler T.Tick, AddressOf T_Tick
  20. T.Interval = Interval
  21. T.Start()
  22. End Sub
  23. Private Sub T_Tick(sender As Object, e As EventArgs)
  24. Select Case MyControl.BackColor.R
  25. Case < FinColor.R
  26. CR += ByStep
  27. If CR + ByStep > FCR Then CR = FCR
  28. Case > FinColor.R
  29. CR -= ByStep
  30. If CR - ByStep < FCR Then CR = FCR
  31. End Select
  32. Select Case MyControl.BackColor.G
  33. Case < FinColor.G
  34. CG += ByStep
  35. If CG + ByStep > FCG Then CG = FCG
  36. Case > FinColor.G
  37. CG -= ByStep
  38. If CG - ByStep < FCG Then CG = FCG
  39. End Select
  40. Select Case MyControl.BackColor.B
  41. Case < FinColor.B
  42. CB += ByStep
  43. If CB + ByStep > FCR Then CB = FCB
  44. Case > FinColor.B
  45. CB -= ByStep
  46. If CB - ByStep < FCB Then CB = FCB
  47. End Select
  48. MyControl.BackColor = Color.FromArgb(CR, CG, CB)
  49. If CR = FCR And CG = FCG And CB = FCB Then sender.Stop()
  50. End Sub
  51. End Class

Решение задачи: «Плавное изменение цвета контрола»

textual
Листинг программы
  1. Public Class Form1
  2.  
  3.     Private _timer As Timer 'таймер для анимации
  4.     Private _ratio As Single 'соотношение смешивания
  5.     Private _onBlend As Boolean 'для анимации. Определяет сторону смешивания
  6.  
  7.     'цвета между которыми происходит переход
  8.     Private _colorA As Color = Me.BackColor
  9.     Private _colorB As Color = Color.BlueViolet
  10.  
  11.     Public Sub New()
  12.         InitializeComponent()
  13.         'Me.DoubleBuffered = True ' если форма мерцает
  14.     End Sub
  15.  
  16.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  17.         _onBlend = Not _onBlend 'работает как переключатель смешивания. можно использовать не дожидаясь конца анимации
  18.         Me.StartAnimate()
  19.     End Sub
  20.  
  21.     'подготовка и запуск таймера
  22.     Public Sub StartAnimate()
  23.         If _timer Is Nothing Then
  24.             _timer = New Timer()
  25.             _timer.Interval = 20 ' 20 * 1/0.1 = 200 мс. Минимальное время анимации
  26.             AddHandler _timer.Tick, AddressOf Animate
  27.             _timer.Start()
  28.         End If
  29.  
  30.     End Sub
  31.  
  32.     'вызов функции анимации при каждом такте таймера
  33.     Public Sub Animate(sender As Object, e As EventArgs)
  34.  
  35.         If _onBlend Then
  36.             _ratio += 0.1F
  37.  
  38.             If _ratio >= 1.0F Then
  39.                 _ratio = 1.0F
  40.                 _timer.Stop()
  41.                 _timer.Dispose()
  42.                 _timer = Nothing 'что бы убедить StartAnimate() что таймер не запущен
  43.             End If
  44.  
  45.         Else
  46.             _ratio -= 0.1F
  47.  
  48.             If _ratio <= 0.0F Then
  49.                 _ratio = 0.0F
  50.                 _timer.Stop()
  51.                 _timer.Dispose()
  52.                 _timer = Nothing
  53.             End If
  54.  
  55.         End If
  56.  
  57.         Me.BackColor = GetBlendColor(_colorA, _colorB, _ratio)
  58.     End Sub
  59.  
  60.     Public Shared Function GetBlendColor(ColorA As Color, ColorB As Color, Ratio As Single)
  61.         'If Ratio < 0.0F Or Ratio > 1.0F Then 'для контроля, если используете в других функциях.
  62.         '    Throw New OverflowException("Значение должно быть в пределах от 0.0 до 1.0")
  63.         'End If
  64.  
  65.         Return Color.FromArgb(ColorA.R + (CInt(ColorB.R) - ColorA.R) * Ratio, _
  66.                               ColorA.G + (CInt(ColorB.G) - ColorA.G) * Ratio, _
  67.                               ColorA.B + (CInt(ColorB.B) - ColorA.B) * Ratio)
  68.  
  69.     End Function
  70.  
  71.  
  72.     'такая структура позволяет не останавливая анимацию переключать сторону смешивания
  73.  
  74. End Class

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


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

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

13   голосов , оценка 3.692 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы