【问题标题】:Prevent drawing beyond canvas with SurfaceView使用 SurfaceView 防止在画布之外绘图
【发布时间】:2013-03-13 11:33:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-canvas surfaceview


    【解决方案1】:

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

    【讨论】:

    • 是的,我可以将它与位图一起使用,但目前它正在绘制比画布更大的路径,这是一个问题。
    • 我解决了这个问题,这是我的答案:stackoverflow.com/questions/54345823/…
    【解决方案2】:

    我不确定画布是否真的会绘制超出尺寸的东西,这不是一件聪明的事情。不过,您可以使用clipRect() 来定义剪辑区域。

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

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

    【讨论】:

    • 是的,模糊确实减慢了速度,尤其是当路径形状大于屏幕时。 clipRect() 没有效果。我试图标记请求和 onDraw() 的结束,以便在触摸事件之间被忽略,但也无济于事;就像绘图已传递给硬件一样,这就是它变慢的地方。
    • 我解决了这个问题,这是我的答案:stackoverflow.com/questions/54345823/…
    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多