2013-03-13 124 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