2013-01-07 50 views
0

请原谅模糊的问题,但我是新来的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线程中运行,其中i现在我想在主视图(我有一个引用Globals.mMainView)上绘制一些东西,而不必重画整个视图来保存CPU并使动画看起来不错。在窗口中,我可以绘制一个带有XOR标志的矩形,它反转了我感兴趣的分数部分,然后再次执行相同的操作以解除它,然后绘制到下一个位置。

在这一点上,我对android毫无头绪。也许有人可能会建议我遵循的最佳途径。谢谢

回答

0

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

+0

这很有趣,所以我把Globals.mMainView.invalidate(40,40,200,200);在onProgressUpdate,它会导致系统调用OnDraw,但现在呢? onDraw如何知道在哪里重绘? – steveh

+0

我试图通过进度更新调用onDraw时没有做任何事情,但我只是得到一个空白的视图。我想我不清楚是什么叫参数无效与参数。 – steveh

+0

我不确定它是如何工作的,但我认为这种方式。你调用'invalidate(Rect dirty)',它会导致系统重新绘制视图。在你的'onDraw()'方法中,你只需要做平常的绘制(在你的案例中绘制一个覆盖图)。就这样。诀窍在于,传递给'onDraw'方法的'canvas'对象被修剪为肮脏的矩形。这就是为什么只有位于矩形内的点才重新绘制。 –