在VIew.onDraw()上使用视图的drawingCache进行平滑滚动

时间:2013-02-04 06:18:45

标签: android view scroll

我想实现具有平滑滚动功能的自定义视图。我看过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");     

}

它可能有效,但有奇怪的行为。有时,缓存的BitmaponDraw()之后没有变化,因此看起来非常奇怪。

而且,主要问题是每次视图滚动时,只需调用drawFullScreen(canvas);,性能就没有太大差别。

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

1 个答案:

答案 0 :(得分:0)

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

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