2013-02-09 102 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