【问题标题】:android drawing overlay on a view in an async task threadandroid在异步任务线程中的视图上绘制覆盖
【发布时间】:2013-01-07 06:26:48
【问题描述】:

请原谅这个模糊的问题,但我是 android 和 java 的新手,而且我读过的关于这个主题的所有东西都只提供了 xml 代码示例,这对我来说没有用,因为我正在以编程方式做所有事情。

所以我有一个绘制乐谱的应用程序,然后随着音乐的播放,我需要在当前播放的音符上覆盖某种光标(可以是矩形框),卡拉 OK 风格。

我创建一个这样的视图

Globals.mMainView = new MainView(context);
            Globals.mMainView.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 60));
            layout.addView(Globals.mMainView);

我将视图引用保存在全局中,以便稍后找到它,(是的,我知道 Java 警察此时会来找我,但我稍后可以找到更优雅的解决方案)。请注意,我的视图位于线性布局中,因为它旁边还有另一个不相关的视图。

在主线程中绘制 onDraw 可以很好地渲染乐谱。

所以,当我点击播放按钮时,我会启动其中一个

class Play1Activity extends AsyncTask<String, Integer, Boolean> 

并在 doInBackground 中播放音频并定期调用具有播放位置的 publishProgress,这反过来会导致 onProgressUpdate 在 UI 线程中运行,我认为它可以安全地进行绘图

现在,我想在主视图顶部绘制一些东西(我有一个参考 Globals.mMainView),而不必重新绘制整个视图以节省 CPU 并使动画看起来不错。在 Windows 中,我可以绘制一个带有 XOR 标志的矩形,它反转我感兴趣的分数部分,然后再次执行相同的操作以取消绘制它,然后在下一个位置绘制。

在这一点上,我对安卓一无所知。也许有人可以建议我遵循的最佳路径。谢谢

【问题讨论】:

    标签: android view android-asynctask overlay


    【解决方案1】:

    如果您知道应该重绘主视图的哪个部分,您可以在视图上调用invalidate (Rect dirty)invalidate (int l, int t, int r, int b)。在这种情况下,唯一的脏区将被重绘。

    【讨论】:

    • 这很有趣,所以我把 Globals.mMainView.invalidate(40, 40, 200, 200);在 onProgressUpdate 中,它会导致系统调用 OnDraw 但现在呢? onDraw 怎么知道在哪里重绘?
    • 当通过进度更新调用时,我尝试在 onDraw 中不做任何事情,但我只是得到一个空白视图。我想我不清楚使用 args 调用 invalidate 的作用。
    • 我不确定它实际上是如何工作的,但我是这样认为的。您调用invalidate(Rect dirty) 会导致系统重绘视图。在您的 onDraw() 方法中,您只需进行通常的绘图(在您的情况下绘制叠加层)。就这样。诀窍是传递给onDraw 方法的canvas 对象被脏矩形剪裁。这就是为什么实际上只有位于矩形内的点才会被重绘。
    • 谢谢,但这似乎不是真的。在我的 onDraw 中,我添加了代码来仅绘制我有兴趣更新的屏幕部分,但这就是我得到的全部。原图不见了。我会多花点时间,无论如何谢谢
    • 我怀疑我的问题是我正在使用 View。我觉得我需要使用 SurfaceView,但还没有真正弄清楚。如果我只是将 'public class MainView extends View' 替换为 'public class MainView extends SurfaceView' 没有任何效果,所以还有更多。
    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2012-08-06
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多