0

Я хочу реализовать кнопку воспроизведения/паузы, которая заполняется, когда музыка воспроизводится. Моя первая попытка заключалась в создании таймера, который срабатывает при 20 FPS (каждые 50 мс) и вызывает View.invalidate() на моей кнопке. Сама кнопка имела клиентский метод onDraw(...), который бы, только статически, нарисовал растровое изображение на холсте.Анимировать кнопку, когда музыка играет

Однако, запустив это в симуляторе (я использую GenyMotion), я сразу заметил, что звуки дрожат, как будто процессор не справляется с этим.

Я новичок в Android, поэтому, прежде чем экспериментировать по-другому, я хотел бы знать, какой рекомендуемый подход для анимации кнопки при воспроизведении музыки?

  • Использование таймера?
  • Как-нибудь с помощью анимации?
  • Могу ли я ускорить рисование? Мне нужно нарисовать маскированное и разоблаченное растровое изображение, так что это могут быть как-то интенсивные операции ЦП.

ответ

1

Предложения Я хотел бы дать:

  • Всегда поджать растровые изображения/изображения перед анимацией. Загрузка ресурсов «на лету» может повлиять на производительность.
  • Используйте Thread для выполнения операций.
  • Лучший способ справиться с выше 2, заключается в использовании SurfaceView
  • Handler это еще один способ для выполнения задач таймера с использованием handler.postDelayed()

Там есть прекрасный пример кода с Android на «Как сделать простой родной игры с использованием SurfaceView ", используя потоки и предварительные загрузки растровых изображений, называемые LunarLander.

Если посмотреть на LunarView.java код, они используют нить с именем LunarThread, который создан на конструкторе LunarView и начал с surface is created.

Внутри LunarThread они выполняют все тяжелые задачи даже рисования (метод выполнения внутренней резьбы).

Основные Обзор LunarView:

  • В конструкторе, создает нить LunarThread, которая с предварительной загрузкой растровых изображений и выполнять задачи, связанные
  • Когда создается поверхность, начинается нить. Поток непрерывно запускается/приостанавливается до тех пор, пока не будет изменено значение булевого флага mRun.
  • Внутри метода запуска, он получает холст от поверхностиView, блокирует и рисует все на холсте для этого кадра и блокирует.
  • Его привлекает все время, пока mRun значение изменилось или когда поверхность разрушается (останавливает поток, внутри surfaceDestroyed(SurfaceHolder holder) метода)

Использование SurfaceView, вы увидите разницу.

+0

Проблема заключается в том, что SurfaceView (с прозрачным фоном) совсем не интегрируется в иерархию представлений.Мне придется отказаться от моей реализации на основе SurfaceView ... – Erik

+0

Что я имею в виду: SurfaceView ничего не рисует, он дает пустой холст. Если вам нужно нарисовать «Вид» самостоятельно, «SurfaceView» - лучший выбор, чем переопределение «onDraw()», так что мы можем избежать всех операций pre-onDraw обычного представления. И вы можете использовать 'Thread', для' onDraw' вам нужен поток пользовательского интерфейса. – vakman

Смежные вопросы