1

我想实现一个具有平滑滚动功能的自定义视图。我读过Android View.onDraw() 总是有一个干净的 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);而且,主要问题是性能与每次视图滚动时调用并没有太大区别。

我在正确的轨道上吗?我已经在 Android 4 上开发,所以我打开了硬件加速。但是文档说该视图已缓存在硬件纹理中。我真的需要在硬件加速环境中绘制缓存吗?

4

1 回答 1

0

我认为当硬件加速开启时你不能依赖绘图缓存。根据有关 View.setDrawingCacheEnabled() 的文档:

“启用绘图缓存类似于关闭硬件加速时设置图层。打开硬件加速时,启用绘图缓存对渲染没有影响,因为系统使用了不同的加速机制,忽略了标志。如果你想要为视图使用位图,即使启用了硬件加速,请参阅 setLayerType(int, android.graphics.Paint) 了解有关如何启用软件和硬件层的信息。”

于 2013-08-15T10:57:32.663 回答