仅用于可见单元格的 Gridview touchListener
Gridview touchListener for only visible cells
我正在制作游戏。我使用 GridView
来显示各种形状的游戏块(类似俄罗斯方块)。所以我有 L block,T block 等
当玩家触摸并按下一个方块时,他可以将它移动到屏幕上的任何地方。每个块实际上是一个 GridView,其中很少有彩色单元格和不可见单元格(取决于块形状)。
当方块彼此靠近时,问题就出现了,而你想移动一个与 "under" 个其他方块相邻的方块。由于 gridView 的形状,触摸绿色块的 1 或 2 位置不会触发绿色块触摸侦听器,而是蓝色(因为蓝色块放置在布局上的绿色之后,并且您在其边界内触摸)。所以玩家将开始移动蓝色块,但他当然想移动绿色。
我该如何解决这个问题?
编辑:
我尝试为每个 Blocks gridView
子节点设置触摸监听器(此时不要介意空单元格),并将信息传递给我创建的方法。但是,ACTION_DOWN
有效,但是一旦我移动手指,就会触发 ACTION_UP
(没有任何 ACTION_MOVE
)。
void setBlockTouchListener(final Block block)
{
for (int i = 0; i < block.getChildCount(); i++)
{
block.getChildAt(i).setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
Log.d("TAG", "child down");
onDown(block, X, Y, MotionEvent.ACTION_DOWN);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
Log.d("TAG", "child cancel");
onCancel(block, X, Y, MotionEvent.ACTION_CANCEL);
break;
case MotionEvent.ACTION_MOVE:
Log.d("TAG", "child move");
onMove(block, X, Y, MotionEvent.ACTION_MOVE);
break;
}
return true;
}
});
}
}
Logcat(当我尝试触摸并移动方块时):
child_down
child_cancel
尝试在
之后调用 requestDisallowInterceptTouchEvent
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;
}
我正在制作游戏。我使用 GridView
来显示各种形状的游戏块(类似俄罗斯方块)。所以我有 L block,T block 等
当玩家触摸并按下一个方块时,他可以将它移动到屏幕上的任何地方。每个块实际上是一个 GridView,其中很少有彩色单元格和不可见单元格(取决于块形状)。
当方块彼此靠近时,问题就出现了,而你想移动一个与 "under" 个其他方块相邻的方块。由于 gridView 的形状,触摸绿色块的 1 或 2 位置不会触发绿色块触摸侦听器,而是蓝色(因为蓝色块放置在布局上的绿色之后,并且您在其边界内触摸)。所以玩家将开始移动蓝色块,但他当然想移动绿色。
我该如何解决这个问题?
编辑:
我尝试为每个 Blocks gridView
子节点设置触摸监听器(此时不要介意空单元格),并将信息传递给我创建的方法。但是,ACTION_DOWN
有效,但是一旦我移动手指,就会触发 ACTION_UP
(没有任何 ACTION_MOVE
)。
void setBlockTouchListener(final Block block)
{
for (int i = 0; i < block.getChildCount(); i++)
{
block.getChildAt(i).setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
Log.d("TAG", "child down");
onDown(block, X, Y, MotionEvent.ACTION_DOWN);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
Log.d("TAG", "child cancel");
onCancel(block, X, Y, MotionEvent.ACTION_CANCEL);
break;
case MotionEvent.ACTION_MOVE:
Log.d("TAG", "child move");
onMove(block, X, Y, MotionEvent.ACTION_MOVE);
break;
}
return true;
}
});
}
}
Logcat(当我尝试触摸并移动方块时):
child_down
child_cancel
尝试在
之后调用 requestDisallowInterceptTouchEventcase 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;
}