2012-11-21 106 views
3

我有一個問題,我無法真正解決。我已經創建了一個圖形應用程序,它將包含大量數據點的數據。爲了能夠在圖形中滾動,我創建了圖形數據的位圖,並根據用戶輸入將位圖移動/移動到屏幕的右側或左側。位圖總是圖形視圖高度和圖形視圖寬度。當用戶移動位圖時,我移動位圖:Android位圖移位/移動問題

memoryCanvas.drawBitmap(memoryBitmap,bitmapShift,0.0f,paint);

其中shift是包含移位值的浮點值。

現在,在我嘗試過的大多數設備上,它工作得很好。我已經在HTC Desire,Galaxy Tab和Galaxy S上試過了。但是當我在自己的Galaxy S上進行測試時,我得到了無法解釋的奇怪結果。請注意,我的Galaxy S包含一個自定義ROM(使用Android 4.0.4),所以這可能是我得到這種行爲的原因,但我仍然無法理解它或正確地緩解它。

所以在一個正常的用例行爲中,位圖被移動了bitmapShift像素數,然後我通過普通線條繪製來填充空白空間。但是當使用我的手機時,緩慢地拖動位圖兩個方向,所以bitmapShift值大約爲0.5,位圖不會移動,或者只是有時會移動。我已經比較了其他平臺上的bitmapShift,並且它們在相同的範圍內,當拖慢時爲0.5。這種行爲當然搞砸了我的圖紙了很多。這在快速拖動時也會發生,但在緩慢拖動時最明顯。

我真的不知道是什麼原因導致此行爲。位圖不會根據我的bitmapShift值移動。它在我嘗試過的所有其他平臺上都有。如果我跳過使用位圖,並根據移位值只繪製線條,一切工作正常。

有沒有人有什麼想法可能會導致此行爲?我坐了幾天試圖找出它後,有點跑了。關鍵代碼如下。這段代碼在我的onDraw函數中。

memoryCanvas.setBitmap(emptyBitmap); //First set another bitmap to clear 
memoryCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); //Clear it 
memoryCanvas.drawBitmap(memoryBitmap, bitmapShift, 0.0f, paint); //Draw shifted bitmap on it 
memoryCanvas.drawLines(lineDrawPoints, 0 , cnt, paint); //Draw remaining lines 
memoryCanvas.setBitmap(memoryBitmap); //Set the original 
memoryCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); //Clear original 
memoryCanvas.drawBitmap(emptyBitmap, 0.0f, 0.0f, paint); //Draw the final image     
canvas.drawBitmap(memoryBitmap, 0, 0.0f, paint); //And finally draw on real canvas 

任何幫助,提示,建議都非常歡迎。

乾杯 威廉

+0

我不知道答案,但這裏只是一個想法:你說的範圍是0.5。 0.5與其屏幕有什麼關係? 0.5是否足夠大,實際移動超過1個像素?再次,只是一個隨機的,毫無根據的想法。 –

+0

是的,我想過這個。我真的不確定android是如何解決這個問題的,但是其他設備上的其他設備都可以正常工作,即使在其他Galaxy S上也可以使用stock ROM。我試圖設置一個限制,所以位圖移位必須> = 1,但這也會導致奇怪的問題。我用手機上的位圖進行的所有操作似乎都不涉及到屏幕。 bitmapShift在我的手機上移動的最小值是0.454167。在股票星系s 0.918750。並不像我之前說過的那麼近。今天繼續... – user1842354

回答

1

當僅存在一個簡單的變換畫布設置(一個簡單的變換=只翻譯,沒有旋轉時,無標度),Skia的,Android的2D呈現庫,對齊位圖像素網格。這意味着小於1個像素的移動可能根本不可見。一個愚蠢的解決方法是在繪製位圖之前在Canvas上設置非常非常小的比例或旋轉變換。這具有不將位圖貼合到像素網格的副作用。

我想我應該在Paint上添加一個新的API,讓應用程序無論設置什麼變換都可以進行位圖的子像素定位。

+0

你能演示一個關於我如何做的例子嗎?不知道你的意思。 – user1842354

+0

我試過了:memoryCanvas.scale(1.00001f,1.00001f); \t \t \t \t memoryCanvas.drawBitmap(memoryBitmap,bitmapShift,0.0f,paint);沒有改變,我試着啓用和禁用hw加速並且沒有改變。但我現在很確定它的全部都與位圖的子像素位移有關。 – user1842354

+0

我通過從不做位圖的子像素位移來解決它。 drawBitmap函數使用浮點值但顯然忽略它並使其爲int,這有點令人困惑。謝謝你指點我正確的方向。 – user1842354