使用SurfaceView防止绘图超出画布

时间:2013-03-13 11:33:01

标签: android android-canvas surfaceview

是否可以阻止绘制超出CanvasSurfaceView边框的位图(如位图或路径)的部分?

当我逐渐缩放超出Canvas'尺寸的物体时,尤其是油漆模糊,这一切都会减慢到停滞状态,我必须等待几秒钟才能恢复控制 - 它没有响应。我通过在屏幕上移动手指来缩放对象;如果我做得太快并且扩展它,那么它确实会减慢绘图速度。

当使用普通的View画布时,我没有遇到同样的问题,所以不知道是什么减慢了它。好像SurfaceView响应太快然后变得拥挤。

因此,改进这一点的一个想法是阻止在画布外绘图,但不确定SurfaceView是否有这样的剪辑选项。

3 个答案:

答案 0 :(得分:1)

一种解决方案可能是使用接受源Canvas / .drawBitmap参数的Rect RectF方法之一,以便只有{{{}的可见部分1}}被渲染。我刚刚在我自己的项目中完成了这项工作,以加快Bitmap性能,我有几个SurfaceView,有时只是部分可见。

答案 1 :(得分:1)

我不确定画布是否会实际超出维度,这不是一件明智的事情。不过,您可以使用clipRect()来定义剪辑区域。

你是否应用像每帧模糊的滤镜?这可能相当昂贵。

另外,你是否在触摸事件上触发了绘制调用?触摸事件生成非常快,并且会使渲染线程泛滥。您可能希望以较慢的速度提取事件:https://groups.google.com/forum/?fromgroups=#!topic/android-developers/Oe6k1_bm38o

答案 2 :(得分: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