java - 仅用于可见单元格的 Gridview touchListener

标签 java android android-gridview

我在做游戏。我使用 GridView 来显示各种形状的游戏 block (类似俄罗斯方 block )。所以我有 L block 、T block 等。

当玩家触摸并按下一个方 block 时,他可以将它移动到屏幕上的任何地方。每个 block 实际上是一个 GridView,其中很少有彩色单元格和不可见的单元格(取决于 block 形状)。

ms paint image

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

我该如何解决这个问题?

编辑:

我尝试为每个 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(当我尝试触摸和移动方 block 时):

child_down
child_cancel 

最佳答案

尝试调用 requestDisallowInterceptTouchEvent

之后
case MotionEvent.ACTION_DOWN

另一个 View 可能正在窃取触摸事件。这将禁止盗窃。

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;
        }

关于java - 仅用于可见单元格的 Gridview touchListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53067727/

相关文章:

Android gridview根据动态数字布局其 subview

java - 如何实现再次播放功能?

java - Android ADT 无法运行项目

java - 在 GridView 组件中显示多个图像时,Android 应用程序崩溃

android - 您使用什么物理 android 设备进行测试?

Android 静态应用程序快捷方式未显示

android - 没有数据时如何为应用程序小部件设置默认文本?

java - 无限递归!如何转换?

java - "add non-palette componente"的 Intellij 错误

android - match_parent 并且未按预期填充 - Android/XML