在播放音乐时为按钮设置动画

时间:2015-03-11 13:08:12

标签: android android-animation android-drawable android-bitmap

我希望在播放音乐时实现一个正在填充的播放/暂停按钮。我的第一次尝试是创建一个以20 FPS(每50毫秒)触发并在我的按钮上调用View.invalidate()的计时器。该按钮本身有一个客户onDraw(...)方法,现在只能静态地将一个位图绘制到画布上。

然而,然后在模拟器中运行它(我使用GenyMotion)我立即注意到声音在摇晃,好像CPU无法处理它。

我是Android的初学者,所以在以不同的方式进行实验之前,我想知道,在音乐播放时,推荐使用按钮设置动画的方法是什么?

  • 使用计时器?
  • 以某种方式使用动画?
  • 我可以加速画画吗?我将需要绘制一个蒙版和一个未屏蔽的位图,因此这些可能是CPU密集的操作。

1 个答案:

答案 0 :(得分:1)

建议我想:

  • 始终在动画前预加载位图/图像。即时加载资源会影响性能。
  • 使用Thread执行操作。
  • 处理上述2的最佳方法是使用SurfaceView
  • Handler是使用handler.postDelayed()
  • 执行计时器任务的另一种方法

Android上有一个漂亮的示例代码,“如何使用SurfaceView制作简单的原生游戏”,使用线程和预加载位图,称为LunarLander

如果查看LunarView.java代码,他们使用的是名为LunarThread的线程,该线程是在LunarView的构造函数上创建的,并以surface is created开头。

它在LunarThread里面,他们正在执行所有繁重的任务甚至绘图(在线程的内部运行方法中)。

LunarView的基本OverView:

  • 在构造函数上,创建线程LunarThread,它预先加载位图并执行相关任务
  • 创建曲面时,启动线程。线程连续运行/暂停,直到布尔标志mRun值发生变化。
  • 在内部运行方法中,它从surfaceView获取画布,锁定并将所有内容绘制到该框架的画布上,然后取消锁定。
  • 它绘制所有时间,直到mRun值更改或表面被破坏(在surfaceDestroyed(SurfaceHolder holder)方法内停止线程)

使用SurfaceView,你会发现不同。