如何在onDraw方法上调试Canvas上的绘图?

时间:2017-10-25 15:52:45

标签: android

我正在实现我的自定义视图,我在其中覆盖onDraw()方法以绘制一些对象集。

应该将对象放置在以特定方式评​​估的坐标中。放置这些对象的代码工作不正确(其中一些或者根本没有绘制或者被其他对象覆盖)所以我需要做一些调试来逐行执行它并观察实际绘制的对象是什么 - 步骤。

但据我所知,在完成所有绘图后,屏幕上会显示实际图片,因为当我执行canvas.drawBitmap行时,我的模拟器屏幕上没有出现任何内容。

我的问题是:调试onDraw()代码的最佳(或可能是唯一的)方法是什么?我在Adroid开发门户网站上做了一些研究,在这里发布了一些问题,但无法找到解决方案。

3 个答案:

答案 0 :(得分:4)

没试过,但它应该让你走上正轨:

  • 在onDraw方法的开头,使用画布的宽度和高度创建一个新的位图
  • 从位图制作新的画布
  • 在此Canvas上运行您的绘制调用
  • 您可以从Android Studio调试器中检查位图,并在每次绘制调用时更新
  • 如果您还想将数据绘制到屏幕上,可以使用原始Canvas上的drawBitmap和完整的Bitmap,但调试时不需要这样做

请勿将其保留在生产代码中

@Override
public void onDraw(Canvas canvas) {
    Bitmap screenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas screenCanvas = new Canvas(screenBitmap);

   /* Run draw calls on screenCanvas, inspect screenBitmap for result*/
}

答案 1 :(得分:1)

我不是专家,但我知道现在Android中的图形加速非常复杂:绘图命令会记录在绘图列表中,然后对绘图列表进行优化并处理以便绘制GPU。而且,从Android 5.0开始,需要在CPU中处理的部分绘图可以(总是?)在后台线程中运行。有关一般背景,请参阅https://source.android.com/devices/graphics/

然后,关于工具,我建议使用systrace。有关如何使用它和更多工具的更多信息和详细示例,请参阅Romain Guy“Android Performance Case Study”和后续“Android Performance Case Study Follow-up”的优秀(尽管可能有点过时)文章。

另请参阅Android文档“Perfect GPU Use”。

希望这能让你走上正确的道路。这是一个非常复杂的主题。

答案 2 :(得分:1)

您可以尝试评论可疑陈述。

另一种选择是使用计时器 - 经常使来自不同线程的视图无效,而onDraw内部仅在经过一段时间后运行不同的语句。对不同的语句使用不同的时间,使其看起来像动画。