2012-05-24 26 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