2012-06-01 19 views
0

我正在使用GraphView API,並且實現了圖表難以處理。當用戶觸摸圖形時,會出現一條垂直線,從數據點延伸到圖形底部。使用下面的代碼,與代碼一起計算標記位置,來刷新onTouch方法線使用invalidate實現交互式畫布時引起的延遲(Rect dirtyRect)

mDrawable = new ShapeDrawable(new RectShape()); 
mDrawable.getPaint().setColor(0xFF363636); 
mDrawable.setBounds((int)markerX,(int) (markerY) , (int)markerX+1, (int) height); 
mDrawable.draw(canvas); 

蔭:

伊夫創建在的onDraw方法線像這樣。

invalidate(mDrawable.getBounds()); 

我的問題發生在drawable被移動時。如果手勢速度足夠快,刷新過程中會出現延遲,並且線條會在圖上消失(幾分之一秒)。該線與運動保持一致,但消失。看起來就像物品移動得越快越好,如果這是有道理的話。

我聽到使整個畫布無效是一個禁忌,並且使你想要改變的邊界無效(我在上面做過的)。當使整個畫布無效時,消失線現象不會發生,但應用程序運行緩慢。

我已經用SurfaceView和表面支架完成了一些神奇的事情,但在這種情況下使用它們似乎反作用。從我的理解,我基本上會使用invalidate()方法,但在不同的線程。所有東西都會一遍又一遍地重新渲染,這似乎是反效果的。

是否有另一種方法可以完成GraphView庫中描述的效果?

回答

0

我可以通過一個簡單的修復來解決這個問題。無論何時移動屏幕(無論是移動(portait模式)還是觸摸(橫向模式)),都會調用onDraw()方法。雖然使用了骯髒的Rect方法(橫向模式),但它仍然有明顯的滯後。在滾動視圖中滾動圖形時也有明顯的滯後。解決方案是將畫布保存到位圖(在第一次調用時),存儲位圖,然後僅在位圖頂部之後繪製標記。無論何時更改視口或添加了不同的數據集,都會將位圖取消以繪製所有數據。代碼

protected void onDraw(Canvas sysCanvas) { 
     canvas = new Canvas(); 

     if (bitmap != null) { 
       sysCanvas.drawBitmap(bitmap, 0,0, null); 
       drawMarker(sysCanvas); //draw whatever you want to the system canvas in a different method 
       return; 
     } 


     bitmap = Bitmap.createBitmap(sysCanvas.getWidth(), sysCanvas.getHeight(), Bitmap.Config.ARGB_8888); 
     canvas.setBitmap(bitmap); 

     ///more code, draw whatever you want to canvas. 
     sysCanvas.drawBitmap(bitmap,0, 0,null); 
    } 

第一次運行後,畫布會繪製圖形。經過第一遍之後,畫布只是繪製位圖,然後轉到繪製對象的方法。這些對象具有在onTouch()方法中設置的x和y參數。

這種方法顯着提高性能。在我的情況下,我有一個scrollView(肖像模式)的圖形。每當scrollview移動時,在任何一個方向上,畫布都會重繪。這種不斷的重繪真的是吃資源。繪製我實施的標記(跟隨你的手指的一個圓圈)也可以這樣說。由於CPU只需重新繪製2個對象,因此所需的時間會更少,從而導致更高的性能。

希望這會有所幫助!