Продвинутое замирание одной картинки в другую - PullRequest
2 голосов
/ 11 сентября 2010

Так что в основном я делаю пользовательскую кнопку.

Желаемое поведение:

Когда пользователь наводит мышью, изображение при наведении мыши исчезает.

Когда пользователь мышкойпри наведении курсора мыши / нажатие изображения исчезнет.

Исключения:

Если пользователь включается или выключается во время воспроизведения анимации затухания, ему потребуется:

  • Мгновенно остановить текущую анимацию
  • Начать переход в новую анимацию с текущей позиции.Пример: допустим, что пользователь проводит мышь, и анимация при наведении мыши воспроизводилась, если бы они были отключены, а затем быстро снова включали мышь, пока анимация мыши отключалась, она не запустит мышь с затуханием с самого начала.но с того места, где остановилась анимация мыши.

Ответы [ 2 ]

2 голосов
/ 11 сентября 2010

Я делал нечто подобное ранее и реализовал это с помощью GDI +.

Кнопка должна делать две вещи в своем методе рисования.

  1. Нарисуйте кнопку по умолчанию безотносительно к прозрачности.
  2. Нарисуйте изображение мышки с заданной альфа.

Используйте BackgroundWorker для плавной анимации. Таким образом, при наведении мыши запустите BackgroundWorker и заставьте его работать, пока Alpha не достигнет 1.0f. Когда мышь удалена от кнопки, рабочий должен уменьшить альфу, пока она не достигнет 0,0f. Имейте переменную с именем fadingin, чтобы BackgroundWorker понял, что он должен делать. Ваше событие ввода-вывода мыши должно просто установить для fadingin значение true или false, а затем запустить BackgroundWorker (если он еще не запущен).

Метод BackgroundWorkers DoWork может выглядеть примерно так:

void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
  long ticks1 = 0;
  long ticks2 = 0;
  double interval = (double)Stopwatch.Frequency / 60;
  while (true) {
    ticks2 = Stopwatch.GetTimestamp();
    if (ticks2 >= ticks1 + interval) {
      ticks1 = Stopwatch.GetTimestamp();

      if(_fadeIn){
        _fadeAlpha += 0.1f;
        if(_fadeAlpha > 1f){
          _fadeAlpha = 1f;
          break;
        }
      }else{
        _fadeAlpha -= 0.1f;
        if(_fadeAlpha < 0f){
          _fadeAlpha = 0f;
          break;
        }
      }
      backgroundWorker.ReportProgress(0);
    }
    Thread.Sleep(1);
  }
  backgroundWorker.ReportProgress(0);
}

Конструкция «Секундомер» и «Цикл» приведут анимацию к анимации 60 кадров в секунду.

backgroundWorker ProgressChanged должен просто изменить ColorMatrix на правильное альфа-значение, привязать ColorMatrix к ImageAttributes и сделать элемент управления недействительным, вызвав Invalidate. Это должно быть сделано для того, чтобы перерисовка графического интерфейса запрашивалась из основного потока, а не из потока BackgroundWorker. Если вы сделаете это непосредственно из DoWork, вы получите исключение, если попытаетесь изменить ImageAttributes во время операции рисования.

Надеюсь, это поможет вам сделать хорошую плавную анимацию на кнопке.

0 голосов
/ 11 сентября 2010

Вам нужно выбрать одну картинку, чтобы быть внизу, и одну, чтобы быть сверху. Для того, чтобы создать анимацию, необходимо, чтобы альфа-значение было скорректировано с шагом от 0 до 255.

Эта ветка форума MSDN описывает метод смешивания.

...