Android onInterceptTouchEvent,获取ViewGroup中的childs

Android onInterceptTouchEvent, get childs in ViewGroup

我有这样一个包含单元格(按钮)的布局(如板)

| A | B | C | D |
-----------------
| E | F | G | H |
-----------------
| I | J | K | L |
-----------------
| X | Y | Z | W |

我正在以编程方式添加单元格,它们包含我设置的字母。

public void addCells(String letters){
    removeAllViews();
    int let = 0;
    for (int j = 0; j < 4; j++){
        for (int i = 0; i < 4; i++){
            String currentLetter = ""+letters.charAt(let);
            //Cell object that contains it's position and letter.
            Cell cell_ = new Cell(this.getContext(), new Point(i , j), new Letter(currentLetter)); 
            this.addView(cell_);
            this.cells[i][j] = cell_;
            let++;
        }
    }
}

我的目标是像这样通过移动手指连接细胞:

我要从 onTouchEvent() 返回 true,这样我就可以捕捉 ViewGroup 中的所有触摸 onInterceptTouchEvent()

public boolean onTouchEvent(MotionEvent motionEvent) {
    return true;
}

但我无法理解其中的逻辑。如何通过该 ViewGroup 中的 click/touch 访问 certain 子对象?

当我单击 'A' 字母时,我想访问该单元格对象。

总的来说:

  • 父视图拦截所有触摸事件(x,y)

    onInterceptTouchEvent() { return true; }
    
  • 在触摸事件中,父级找到与事件位置匹配的内部视图

    onTouchEvent() { // see below }
    
  • 对该视图执行操作(点亮它、更新数据等)

家长如何才能找到内景?

您可以通过两种方式完成,

1) 有一个数据结构 ([][]) 用于保存对单元格视图的引用的板。然后你知道什么是触摸事件 X,Y 所以如果所有单元格都相等,只需根据单元格大小和位置计算正确的单元格。

View[][] board;
// Add the Views to the board in creation loop

int cellWidth = board[0][0].getMeasuredWidth();
int cellHeight = board[0][0].getMeasuredHeight();

int tragetX = (int)(x / cellWidth);
int targetY = (int)(y / cellHeight);

View targetCell = board[targetX][targetY];

// Do something with targetCell

2) 遍历所有父子节点(从最后到第一个最好),并计算父位置内的子视图位置,并结合其大小确定该子节点是否为目标。

View targetChild = null;
int[] loc = new int[2];
for (int i = getChildCount()-1; i >= 0; i--) {
    View child = getChildAt(i);
    child.getLocationInWindow(loc);
    if (x >= loc[0] && x <= loc[0]+child.getMeasuredWidth() &&
        y >= loc[1] && y <= loc[1]+child.getMeasuredHeight()) {
        targetChild = child;
        break;
    }
}
// Do something with targetChild

以上是一个例子,请写出更好的代码:)(重用loc等...)