2012-05-24 64 views
1

我正在嘗試構建一個簡單的應用程序,該應用程序將顯示方形貼磚的二維,可滾動矩陣。想象一下2D Rubick's Cube,您可以選擇將單行或單列滾動,就像它是一個戒指一樣。如何在Android中製作可滾動的矩陣?

我在主視圖中放置了一個RelativeLayout,並通過定製的ImageView組件實現了矩陣的所有圖塊。我設置了單磚的確切位置操縱RelativeLayout.LayoutParams值:

RelativeLayout rl = ...; 
TileView tile = ...; 
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(size, size); 
rlp.setMargins(left, top, 0, 0); 
rl.addView(tile, rlp); 

我真的不喜歡這種方法,因爲我想改變的瓷磚,而不是邊緣的頂部和左側的參數,但是這就是我已經能夠做到最好。

我附聽者每個區塊處理的相對的行或列的拖動,這取決於事件拖動的方向。一切似乎都做工相當精細,除了幾個問題:當我滾動行權,右邊利潤率將逐步萎縮,因爲如果它試圖填補剩餘空間最後的區塊

  1. ,和最終會消失。
  2. 當我再滾動回左邊消失瓷磚不會再出現。

此外,我仍然需要指出給用戶一個無限行/列的錯覺的最佳方式。我想我應該複製每個行/列兩側的所有圖塊,可能只有當該行/列正在滾動時。

我要求你的幫助只是爲了瞭解你的想法是實現這個接口的最好辦法,因爲我想我搞亂了代碼。如果你需要更多的細節,只需問我。

謝謝!

回答

1

如果我這樣做,我的傾向會在它去在一個較低的水平比你。我將使用SurfaceView作爲主視圖,並使用Canvas.drawBitmap()呈現圖塊。這可能聽起來像更多的工作,但我認爲這是做你想做的事的正確方法,最終你會對結果感到高興。

爲了解決您的兩個問題:

  1. drawBitmap()我掛讓你指定的位圖繪製的子集,所以你可以剪輯的瓷磚,而不是萎縮,因爲它熄滅屏幕版本。
  2. 您將負責確定去哪裏(和繪圖它有),所以代表瓦片矩陣的數據結構需要來代表離屏幕像素塊爲好。
+0

我選擇使用不同的視圖爲每個有更好的方式來處理觸摸和對行/列滾動的事件。如果我使用單個「SurfaceView」,我應該如何處理這些事件?在那種情況下,我會有一個大視圖,應該使用座標來找到我感動的瓷磚? – marzapower

+0

是的,就像我說的那樣,它的層次較低 - 所以你必須做一些小算術來將觸摸座標轉換爲平鋪行/列座標,然後從這裏開始。對於你在做什麼而言,有一定的獨特性的門檻,在哪一點下降到較低的水平會使事情變得更容易,即使諸如弄清楚哪個瓷磚被觸摸變得稍微難一些。我會說你在做什麼聽起來像遊戲一樣,大多數遊戲都會按照我的建議做一些事情。 –

+0

我認爲即使是動畫也很難處理。我的意思是,如果我需要爲單個磁貼啓動一個動畫以使其消失(在Alpha通道上工作),我認爲在這個較低的級別上執行也將非常困難... – marzapower