我想实现一个具有平滑滚动功能的自定义视图。我读过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 上开发,所以我打开了硬件加速。但是文档说该视图已缓存在硬件纹理中。我真的需要在硬件加速环境中绘制缓存吗?