我想实现一个自定义视图与平滑滚动功能。我读过Android View.onDraw() always has a clean Canvas。通过构建离屏位图,甚至需要更多的时间来绘制离屏位图。因此,我考虑使用视图图形缓存。
@Override
public void onDraw(Canvas canvas){
long start = System.nanoTime();
if(redrawAll){
drawFullScreen(canvas);
handler.post(new Runnable(){
@Override
public void run() {
cachedBitmap = SampleView4.this.getDrawingCache();
}
});
}
else{
if(cachedBitmap != null && !cachedBitmap.isRecycled()){
canvas.drawBitmap(cachedBitmap ,scrollByX, scrollByY, p);
drawPartOfScreen(canvas, scrollByX, scrollByY);
}
handler.post(new Runnable(){
@Override
public void run() {
cachedBitmap = SampleView4.this.getDrawingCache();
}
});
}
Log.d(TAG, "drawTiles take: "+(System.nanoTime() - start) + " ns");
}它可能可以工作,但有奇怪的行为。有时,缓存的Bitmap在onDraw()之后没有变化,因此看起来非常奇怪。
而且,主要的问题是,每次滚动视图时,性能与仅调用drawFullScreen(canvas);没有太大区别。
我在正确的轨道上吗?我在Android4上进行开发,所以我打开了硬件加速。但是文档说视图已经缓存在硬件纹理中了。在硬件加速环境中真的需要图形缓存吗?
发布于 2013-08-15 18:57:33
我认为当硬件加速开启时,你不能依赖图形缓存。根据关于View.setDrawingCacheEnabled()的文档:
“启用绘图缓存类似于关闭硬件加速时设置层。当硬件加速打开时,启用绘图缓存对渲染没有影响,因为系统使用忽略标志的不同加速机制。如果要对视图使用位图,即使启用了硬件加速,有关如何启用软件层和硬件层的信息,请参阅setLayerType(int,android.graphics.Paint)。”
https://stackoverflow.com/questions/14681359
复制相似问题