2013-02-09 105 views
4

大家好,我還是想知道是否有可能繪製到屏幕外帆布/位圖,並充分利用硬件加速的優勢,我必須的ViewAndroid的畫布和硬件加速?

例如,onDraw()方法我畫到屏幕外位圖中繪製通過執行以下操作:

Bitmap.Config config = Bitmap.Config.ARGB_8888; 
Bitmap buffer = Bitmap.createBitmap(200, 200, config); 
Canvas canvas = new Canvas(buffer); 
Paint paint = new Paint(); 
paint.setColor(Color.RED); 
canvas.drawLine(0, 0, 100, 100, paint); 

相比,但是canvas.isHardwareAccelerated()返回false和繪圖遲緩:

protected void onDraw(Canvas canvas) { 

    Paint paint = new Paint(); 
    paint.setColor(Color.RED); 

    canvas.drawLine(0, 0, 100, 100, paint); 
} 

,其中canvas.isHardwareAccelerated()返回true。有沒有辦法在利用硬件加速的同時繪製到位圖?或者我必須直接在onDraw方法中繪製屏幕?

謝謝您的幫助:)我知道在Java中我可以得出一個BufferedImage的屏幕外,它會被硬件加速,但在手機上也許它不一樣的...

回答

1

因爲在第一種情況下,您創建畫布時,不會由硬件層進行備份。 此外,截至目前,您無法在任何Canvas上啓用HWA,它必須屬於HWA視圖。

另一方面,可以訪問系統的硬件功能。您可以通過調用setLayerType(LAYER_TYPE_HARDWARE)來使用它,如文檔中所述:

指示視圖具有硬件層。一個硬件層是 ,由硬件特定的紋理(通常幀緩衝區對象 或OpenGL硬件上的FBO)支持,並使視圖使用 Android的硬件渲染管道渲染,但只有在視圖層次結構的硬件 打開。當硬件加速關閉時,硬件層的行爲與軟件層 完全相同。

此外,性能方面的考慮更多地適用於渲染部分,而不適用於繪製。所有繪製操作都記錄爲一個Picture對象。它是HWA扮演重要角色的渲染操作。

+1

根據此回答:http://stackoverflow.com/a/9950775/935242 「SurfaceView.lockCanvas()返回的畫布目前無法進行硬件加速。」 – ggurov 2013-08-15 11:12:47

+1

TextureView相同:http://stackoverflow.com/a/14987164/935242 「TextureView只在應用程序硬件加速時起作用,但它從lockCanvas()返回的Canvas目前從未硬件加速......目前,獲得硬件加速Canvas的唯一方法是使用View的onDraw(Canvas)方法。「 – ggurov 2013-08-15 11:32:28

+0

@ggurov更新。謝謝。 – 2013-08-15 12:20:33