Расширенное исчезновение одной картинки на другой

StackOverflow https://stackoverflow.com/questions/3689655

  •  02-10-2019
  •  | 
  •  

Вопрос

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

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

Когда пользователь Mouses закончится, то картина мыши мыследие исчезнет.

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

Исключения:

Если пользователь Mouses IN, или выключен, пока играет исчезновение анимации, то ему нужно:

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

Решение

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

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

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

Используйте фоновый работа, чтобы дать вам гладкую анимацию. Итак, на мыши начнут фоновый работа и заставь его бежать до того, как альфа достигает 1.0f. Когда мышь удаляется из кнопки, работник должен уменьшить альфа, пока он достигнет 0,0F. Имейте переменную под названием Fadingin так, чтобы фоновый работа поймут, что он должен делать. Событие мыши и OUT должна просто правильно установить Fadingin в True или False, затем начать фоновый работа (если он еще не работает).

Метод Dowork Flowersworkers 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);
}

Построение секундомера и петли здесь сделает анимацию стремиться к анимации 60FPS.

PresualWorker ProgressChanged должен просто изменить Colormaterix в соответствующую альфа-значение и связывающую COLORMATRIX к ImageAttributes и недействителю в управление, вызывая INVALING. Это должно быть сделано так, чтобы REPACT GUI запрашиваться от основного потока, а не в фоновом потоке Worker. Если вы сделаете это непосредственно из DOWORK, вы получите исключение, если вы попытаетесь изменить ImageAttribute, когда происходит операция натяжения.

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top