仅可见单元格的Gridview touchListener

时间:2018-10-30 15:26:24

标签: java android android-gridview

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

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

ms paint image

当块彼此靠近并且您要移动其他块“下方”的块时,会出现问题。由于使用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 

1 个答案:

答案 0 :(得分:1)

尝试在

之后致电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;
        }