2011-07-12 41 views
0

我在Android中有一個繪圖應用程序,允許用戶用他們的手指進行繪製,然後將結果形狀存儲爲Android Path s。爲了允許用戶刪除他們繪製的單個的Path,我實現了this solution,其爲每個Path使用邊界Rect,然後使用內部多維二進制陣列來表示邊界Rect內的像素。然後,我通過使用路徑的控制點並沿着它使用二次貝塞爾曲線的數學方程來填充陣列,將陣列中的每個元素設置爲其下的像素爲1.Android路徑碰撞問題/解決方案

使用上述設置,在擦除模式下,我首先檢查用戶手指與邊界Rect之間的碰撞,如果碰撞,我然後檢查用戶觸摸的像素是否設置爲1。

現在,當用戶加載一個音符時,我將所有的形狀加載到'stroke'對象的一個​​ArrayList中,這樣我就可以很容易地顯示它們,並且可以循環遍歷它們來檢查擦除模式下的衝突。我還在自定義對象中存儲了Rect和帶有筆畫的二進制數組。一切都按預期工作,但存儲所有這些數據的內存佔用空間,特別是每個路徑的邊界Rect的二進制數組越來越昂貴,並且當用戶有大量筆畫時,我得到的部分是java.lang.OutOfMemoryError我的代碼是爲每個筆畫創建數組。

任何建議,以更好的方式來實現這一目標?本質上,我試圖確定兩個Android路徑(繪圖路徑,然後是用戶在擦除模式下創建的路徑)之間的碰撞,而上述理論上工作時,實際上這是不可行的。

感謝,

保羅

回答

0

什麼是 「二進制數組」 的實際表現?我認爲如果你調整表示以反映你需要存儲的實際數據(例如RLE對位進行編碼:在這個y開始在這個x和z像素),你將能夠存儲你所需要的,沒有過多的大小。

存儲實際的字節數組,每個像素一個字節,或每8個像素(如果這就是你正在做的),這是不必要的。

另一種選擇是根本不存儲位圖,只是控制點和邊界框。如果觸摸與邊界框相交,則可以根據控制點即時計算位圖。

+0

該表示法是位圖的表示形式,因此該數組的類型爲int,並且其維數爲rect_width,rect_height。嗯,已經想過即時計算位圖,但從性能的角度來看它可能太昂貴(儘管我可能沒有選擇,顯然)。 RLE也可能工作,所以基本上,我會存儲路徑的RLE指令,當試圖檢測X點,Y點擊Path時,我會沿着RLE追蹤? –

+0

@Paul - 你有兩個RLE選項;一個是爲邊界框中的每個y存儲路徑和y爲(x,run_length)對象的交集(這是一條貝塞爾曲線,所以每個y將會有最多兩個,我猜...) – antlersoft