请原谅模糊的问题,但我是新来的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毫无头绪。也许有人可能会建议我遵循的最佳途径。谢谢
这很有趣,所以我把Globals.mMainView.invalidate(40,40,200,200);在onProgressUpdate,它会导致系统调用OnDraw,但现在呢? onDraw如何知道在哪里重绘? – steveh
我试图通过进度更新调用onDraw时没有做任何事情,但我只是得到一个空白的视图。我想我不清楚是什么叫参数无效与参数。 – steveh
我不确定它是如何工作的,但我认为这种方式。你调用'invalidate(Rect dirty)',它会导致系统重新绘制视图。在你的'onDraw()'方法中,你只需要做平常的绘制(在你的案例中绘制一个覆盖图)。就这样。诀窍在于,传递给'onDraw'方法的'canvas'对象被修剪为肮脏的矩形。这就是为什么只有位于矩形内的点才重新绘制。 –