【发布时间】:2011-06-10 15:26:09
【问题描述】:
我有一个绘图应用程序,用户可以在其中用手指画线,调整颜色、粗细等。当用户绘图时,我将集中的 X/Y 点从 MotionEvent 转换为 SVG Paths,以及创建Android Path's,然后通过 Canvas 将 Android 路径绘制到屏幕上,并将 SVG 路径提交到应用程序的数据库中。
我遵循FingerPaint 中使用的模型,通过重复调用invalidate()(因此,onDraw())即时绘制“进行中”行,一旦行完成,新行开始,前一行从底层 Canvas Bitmap 在 onDraw() 中绘制,正在进行的行再次生成重复重新绘制。
这在此应用程序中运行良好 - 直到您开始旋转底层 Bitmap 以补偿设备旋转,支持在绘图表面上“放大”的能力,因此必须缩放底层 Bitmap 等。所以举个例子,当设备旋转并且绘图被缩放时,当用户在绘图时,我们需要在 onDraw() 中缩放和旋转我们的 Bitmap,这绝对是在爬行。
我看过SurfaceView,但由于它仍然使用相同的Canvas 机制,我不确定我会看到明显的改进......所以我的想法转向了OpenGL。我在某处读到 OpenGL 基本上可以“免费”进行旋转和缩放,甚至看到rumors(第三条评论)Canvas 可能会在未来的版本中消失。
基本上,我在Canvas 和 OpenGL 解决方案之间有点卡住了...我有一个 2D 绘图应用程序,它在一种状态下似乎完全适合 Canvas 模型,因为没有不断的重新绘制像游戏一样进行(例如,当用户不绘图时,我不需要任何重新绘图),但是当用户正在绘图时,我需要在表面上做一些越来越复杂的事情所必需的最大性能......
欢迎任何想法、指点和建议。
【问题讨论】: