首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VIew.onDraw()上使用视图的drawingCache进行平滑滚动

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

Stack Overflow用户
提问于 2013-02-04 14:18:45
回答 1查看 1.2K关注 0票数 1

我想实现一个自定义视图与平滑滚动功能。我读过Android View.onDraw() always has a clean Canvas。通过构建离屏位图,甚至需要更多的时间来绘制离屏位图。因此,我考虑使用视图图形缓存。

代码语言:javascript
复制
@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);没有太大区别。

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

EN

回答 1

Stack Overflow用户

发布于 2013-08-15 18:57:33

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14681359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档