2013-02-04 45 views
1

我想實現具有平滑滾動功能的自定義視圖。我已閱讀Android View.onDraw() always has a clean Canvas。通過構建一個離屏位圖,它甚至需要更多的時間來繪製離屏位圖。因此,我想到了使用視圖繪圖緩存。在VIew.onDraw()上使用視圖的drawingCache進行平滑滾動

@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,所以我打開硬件加速。但文檔表示該視圖已經緩存在硬件紋理中。我真的需要在硬件加速環境中繪製緩存嗎?

回答

0

我認爲硬件加速打開時不能依靠繪圖緩存。根據有關View.setDrawingCacheEnabled()的文檔:

「啓用繪圖緩存與設置硬件加速關閉時的圖層類似。啓用硬件加速時,啓用繪圖緩存對渲染沒有影響,因爲系統使用不同的加速機制來忽略該標誌如果要爲視圖使用位圖,即使啓用了硬件加速,請參閱setLayerType(int,android.graphics.Paint)以獲取有關如何啓用軟件和硬件的信息層「。