Java Gridview touchListener仅用于可见单元格

Java Gridview touchListener仅用于可见单元格,java,android,android-gridview,Java,Android,Android Gridview,我在做游戏。我使用GridView来显示各种形状的游戏块(类似俄罗斯方块)。比如L块,T块等等 当玩家触摸并按下一个方块时,他可以将其移动到屏幕上的任何位置。每个块实际上是一个GridView,它几乎没有着色的单元格,也没有不可见的单元格(取决于块的形状) 当这些块彼此靠近时,如果要移动“在”其他块下的块,则会出现问题。由于gridView形状的原因,在绿色块的1或2位置触摸将不会触发绿色块触摸侦听器,而是触发蓝色块(因为蓝色块放置在布局上的绿色块之后,并且您正在其边界内触摸)。因此,玩家将开

我在做游戏。我使用
GridView
来显示各种形状的游戏块(类似俄罗斯方块)。比如L块,T块等等

当玩家触摸并按下一个方块时,他可以将其移动到屏幕上的任何位置。每个块实际上是一个GridView,它几乎没有着色的单元格,也没有不可见的单元格(取决于块的形状)

当这些块彼此靠近时,如果要移动“在”其他块下的块,则会出现问题。由于gridView形状的原因,在绿色块的1或2位置触摸将不会触发绿色块触摸侦听器,而是触发蓝色块(因为蓝色块放置在布局上的绿色块之后,并且您正在其边界内触摸)。因此,玩家将开始移动蓝色方块,但他当然想移动绿色方块

我如何解决这个问题

编辑:

我尝试将touch listener设置为每个Blocks
gridView
child(此时不要介意空单元格),并将信息传递给我创建的方法。但是,
ACTION\u DOWN
起作用,但一旦我移动手指,就会触发
ACTION\u UP
(没有任何
ACTION\u move

请稍后再打电话

另一种观点可能是窃取触摸事件。这将不允许盗窃

Block block = ((Block) v.getParent());

switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        block.requestDisallowInterceptTouchEvent(true);
        onDown(block, X, Y, MotionEvent.ACTION_DOWN);
        break;
        }

请你再解释一遍好吗?我不明白。你想只听彩色细胞吗?没错。但是,当我为gridView的每个单元格设置侦听器时,我不会从中接收更多的事件。“MotionEvent.ACTION_MASK”代码是否必要?它用于分隔实际操作和指针标识符,但在这种情况下是不必要的。好吧,我发现您描述的这个步骤对我来说不是必需的,但是
block.getLayoutParams().width=somevalue
(这就是我在onDown中所做的)是“使用”触摸事件并触发
操作的行。你有什么建议,即使在改变了版面的宽度和高度后,如何聆听?顺便说一句,在更改参数以应用它们之后,我也调用了
requestLayout()
。@BlackJack如果您想更改块的大小,您可以尝试使用而不是布局参数block.animate().scaleX(1.1f).scaleY(1.1f).start()'将使视图增长10%,不应导致取消。我认为一旦解决了这个问题,我的答案将是有用的。谢谢,我实现了动画而不是参数,现在可以像以前一样在布局上拖动和移动块。但只有一件事仍然不起作用,那就是空单元格下单元格上的touchListener(图1),甚至我只将listener设置为实际显示的单元格(空单元格的可见性
消失了
并且没有touchListener)。当我触摸那个单元时,没有一个块得到触摸焦点。其他细胞工作正常。别忘了,最后我需要
requestDisallowerWinterCeptoucheven
,就像你说的,所以它也在代码中。PS:我真的很想给你赏金,只是…@BlackJack即使手机已经不见了,持有手机的
视图组
块也在进行触摸事件。在
块中为
onTouchEvent()
添加覆盖,并始终返回
false
。这将允许基础单元格获得控制权。查看更多信息。现在尝试,但仍然没有更改。我来看看你贴的例子。
child_down
child_cancel 
case MotionEvent.ACTION_DOWN
Block block = ((Block) v.getParent());

switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        block.requestDisallowInterceptTouchEvent(true);
        onDown(block, X, Y, MotionEvent.ACTION_DOWN);
        break;
        }