2013-03-13 125 views
5

是否有办法防止绘制部分对象,如位图或路径,这些对象超出了SurfaceView中的Canvas的边界?防止使用SurfaceView绘制画布以外的画布

当我逐渐缩放超过Canvas尺寸的物体时,尤其是模糊的涂料时,它会放慢速度,静止不动,我必须等待几秒钟才能恢复控制 - 它不会响应。我通过在屏幕上移动手指来缩放对象;如果我把它做得太快并扩大规模,那么它确实会减慢绘图速度。

我在使用普通的View画布时没有同样的问题,所以不知道是什么放慢了画面。这好像SurfaceView响应太快,然后拥塞。

所以改进这一点的一个想法是防止在画布外画,但不知道SurfaceView是否有这样的剪裁选项。

回答

1

一种解决方案也许是通过使用一个接受源Rect/RectF参数的Canvas.drawBitmap方法之一,使得仅Bitmap的可见部分被呈现。我刚刚在我自己的项目上完成了这项工作,以加快SurfaceView的表现,其中有几个Bitmaps有时只是部分在视野中。

+0

是的,我可以在位图中使用此功能,但此时它正在绘制比画布更大的路径,这是一个问题。 – Lumis 2013-03-13 12:04:59

0

当你把SurfaceView您的活动的布局,您可以使用填充属性,如:

android:paddingLeft="20dp" 
android:paddingTop="20dp" 
android:paddingRight="20dp" 
android:paddingBottom="20dp" 

它的工作原理是这样的:

Padding depiction

为了吸引你的画布,你可以用以下方式绘制边界:

canvas.drawLine(1,1,canvas.getWidth()-1,1); //Top border 
canvas.drawLine(1,1,1,canvas.getHeight()-1); //Left border 
canvas.drawLine(1,canvas.getHeight()-1,canvas.getWidth()-1,canvas.getHeight()-1); //Bottom border 
canvas.drawLine(canvas.getWidth()-1,1,canvas.getWidth()-1,canvas.getHeight()-1); //Right border 
1

我不确定如果画布实际上会画出超出尺寸的东西,那不会是一件明智的事情。不过,您可以使用clipRect()来定义剪辑区域。

你是否在使用每帧模糊滤镜?这可能相当昂贵。

另外,你是否触发了触摸事件的绘图调用?触摸事件生成速度非常快,并会渲染渲染线程。您可能想以较慢的速度接收事件:https://groups.google.com/forum/?fromgroups=#!topic/android-developers/Oe6k1_bm38o

+0

是的,模糊确实会减慢速度,特别是当路径形状比屏幕更大时。 clipRect()不起作用。我试图标记乞讨和onDraw()的结尾,以便在触摸事件之间被忽略,但也没有帮助;就像绘图已经传递给硬件,那就是它放慢速度的地方。 – Lumis 2013-03-25 21:57:42