2013-02-14 166 views
1

我的android應用程序出現問題,它在平面上繪製函數圖。爲此,我使用自定義視圖。用戶可以通過觸摸平移座標系。在onDraw方法中,座標系和標籤直接繪製在視圖的畫布上,但是圖形本身被緩衝到一個額外的位圖上(出於執行的原因) - 在手指移動期間,這個位圖被繪製到視圖的畫布上以匹配座標系,並且只有當用戶釋放觸摸時才重新繪製功能。Android - Canvas.drawBitmap在某些設備上無法正常工作

public void onDraw(Canvas canvas){ 
    if (start) { 
     bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444); 
     hCanvas = new Canvas(bitmap); 
     start = false; 
    } 
    drawCoordinateSystem(canvas); 
    drawFunctions(canvas,bitmap,hCanvas); 
} 

在onTouch事件偵聽器中,我調用invalidate()。有一個布爾型「移動」,對ACTION_UP設置爲true,對於ACTION_DOWN設置爲false。

public void drawFunctions(Canvas canvas,Bitmap bitmap,Canvas hCanvas){ 
    if (moving) canvas.drawBitmap(bitmap,left+translateX,top+translateY,paint); 
    else { 
     hCanvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR); 

     //code for drawing the functions on hCanvas 

     canvas.drawBitmap(bitmap,0,0,paint); 
    } 
} 

在ACTION_MOVE中,我適當地計算了translateX和translateY值。

現在問題出在哪裏: 如果我爲sdk 10編譯應用程序,它在我測試過的所有設備(Android 2.2-4.2智能手機和平板電腦,虛擬和物理)上運行正常。但是,當我爲sdk 14編譯它時,對於許多設備(除了某些平板電腦,其座標系被正確繪製),它的效果很好,但包含函數的位圖不會在視圖的畫布上繪製,並且功能不可見。奇怪的是,如果我嘗試從視圖畫布中製作位圖:

Bitmap bmp = this.getDrawingCache(); 
bmp.compress(Bitmap.CompressFormat.PNG, 100, out); 

在保存的位圖中,函數是可見的。

另一件事是 - 問題發生在i.a. Nexus 7,同時在預設的Nexus 7上創建的AVD一切正常。

可能是什麼問題?

回答

0

http://developer.android.com/reference/android/graphics/Bitmap.Config.html

我會複製並粘貼相關部分: Bitmap.Config ARGB_4444該字段在API級別已被否決。由於此配置的質量差,因此建議使用ARGB_8888。
Bitmap.Config ARGB_8888每個像素存儲在4個字節。

改變你的4444到8888,它應該工作。

+0

感謝您的建議,但它仍然無法正常工作。更重要的是,位圖相當大(比屏幕更大,因此用戶可以在滾動的同時獲得實時呈現的印象),所以如果我設置ARGB8888,某些設備上存在內存問題。我使用ARGB4444來最大限度地減少內存使用量。另一件事 - 我的問題似乎只發生在Tegra設備上。在使用位圖繪製其他視圖之前,有什麼辦法可以緩衝某些內容? – user2073589 2013-02-15 17:24:06

相關問題