Android 使用SurfaceView防止在画布之外绘制

Android 使用SurfaceView防止在画布之外绘制,android,android-canvas,surfaceview,Android,Android Canvas,Surfaceview,有没有办法防止绘制超出SurfaceView中Canvas边界的对象部分,如位图或路径 当我逐渐缩放一个对象,使其超出画布”的大小时,尤其是在绘制模糊的情况下,它的速度会减慢到静止状态,我必须等待几秒钟才能恢复控制——它没有响应。我通过在屏幕上移动手指来缩放对象;如果我做得太快,并放大它,那么它真的会减慢绘图速度 我在使用普通的视图画布时没有遇到同样的问题,所以不知道是什么让它变慢了。这就好像SurfaceView响应太快,然后变得拥挤 所以一个改进的方法是防止在画布外绘制,但不确定Surfac

有没有办法防止绘制超出
SurfaceView
Canvas
边界的对象部分,如位图或路径

当我逐渐缩放一个对象,使其超出
画布
”的大小时,尤其是在绘制模糊的情况下,它的速度会减慢到静止状态,我必须等待几秒钟才能恢复控制——它没有响应。我通过在屏幕上移动手指来缩放对象;如果我做得太快,并放大它,那么它真的会减慢绘图速度

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


所以一个改进的方法是防止在画布外绘制,但不确定
SurfaceView
是否有这样的剪辑选项

一种解决方案可能是使用接受源
Rect
/
RectF
参数的
Canvas
.drawBitmap方法之一,以便仅呈现
位图的可见部分。我刚刚在我自己的项目中这样做是为了提高
SurfaceView
的性能,我有几个
位图,它们有时只能部分显示在视图中。

当您将SurfaceView放在活动的布局上时,可以使用填充属性,如:

android:paddingLeft="20dp"
android:paddingTop="20dp"
android:paddingRight="20dp"
android:paddingBottom="20dp"
它的工作原理如下:

要绘制画布,您可以使用以下工具绘制边界:

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

我不确定canvas是否真的能画出维度以外的东西,这不是一件明智的事情。仍然可以使用
clipRect()
定义剪辑区域

您是否应用了每帧模糊之类的过滤器?那可能相当昂贵


此外,您是否在触摸事件中触发抽奖呼叫?触摸事件生成速度非常快,将淹没渲染线程。您可能希望以较慢的速度拾取事件:

是的,我可以将其用于位图,但目前绘制的路径比画布大,这是一个问题。我解决了这个问题,下面是我的答案:是的,模糊确实会减慢速度,尤其是当路径形状大于屏幕时。clipRect()无效。我试图标记乞讨和onDraw()的结束,以便在两者之间忽略触摸事件,但也无济于事;就像图纸被传递到硬件,这就是它变慢的地方。我解决了这个问题,下面是我的答案: