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等...)
我有这样一个包含单元格(按钮)的布局(如板)
| 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等...)