【问题标题】:Animate a button as music plays播放音乐时为按钮设置动画
【发布时间】:2015-03-11 13:08:12
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我想提出的建议:

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

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

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

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

    LunarView 基本概览:

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

    使用SurfaceView,你会看到不同。

    【讨论】:

    • 问题是,SurfaceView(具有透明背景)根本无法很好地集成到视图层次结构中。我将不得不放弃基于 SurfaceView 的实现...
    • 我的想法是:SurfaceView 什么都不画,它给你空白画布。如果你必须自己绘制视图,SurfaceView 是最好的选择,而不是覆盖onDraw(),这样我们就可以避免普通视图的所有 pre-onDraw 操作。你可以使用Thread,对于onDraw,你需要UI线程。
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多