我想实现具有平滑滚动功能的自定义视图。我看过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);
,性能就没有太大差别。
我是否在正确的轨道上?我已经开发了Android 4,所以我打开硬件加速。但文档称该视图已缓存在硬件纹理中。我真的需要在硬件加速环境中绘制缓存吗?
答案 0 :(得分:0)
我认为当硬件加速开启时,你不能依赖于绘制缓存。根据有关View.setDrawingCacheEnabled()的文档:
“启用绘图缓存类似于在关闭硬件加速时设置图层。启用硬件加速时,启用绘图缓存对渲染没有影响,因为系统使用不同的加速机制忽略标记如果要对视图使用Bitmap,即使启用了硬件加速,请参阅setLayerType(int,android.graphics.Paint)以获取有关如何启用软件和硬件层的信息。“