作为Android编程新手我试图找出,如果用户在自定义视图(源代码:MyView.java)触摸了一个孩子(下图中左边的黄色图块):
对于hitTesting,我写了以下方法:
private Drawable hitTest(int x, int y) {
for (Drawable tile: mTiles) {
Rect rect = tile.getBounds();
if (rect.contains(x, y))
return tile;
}
return null;
}
但我不知道如何翻译MotionEvent坐标,然后再将它们传递给上述方法。我尝试了很多可能的组合,涉及我的自定义mScale
的{{1}}和mOffset
属性(我不想使用View
和View.scrollTo()
方法 - 但是处理偏移并自我扩展。)
当我开始随机触摸屏幕时,我有时会碰到瓷砖 - 所以我看到我的hitTest方法没问题,但我只需要弄清楚正确的翻译。
我是否想念这里的内容,我是否可以在View.setScaleX()
和真实像素之间添加一些翻译?
dp
更新:关注pskink的建议(谢谢)我正在尝试使用public boolean onTouchEvent(MotionEvent e) {
Log.d("onToucheEvent", "mScale=" + mScale +
", mOffsetX=" + mOffsetX +
", mOffsetY=" + mOffsetY +
", e.getX()=" + e.getX() +
", e.getY()=" + e.getY() +
", e.getRawX()=" + e.getRawX() +
", e.getRawY()=" + e.getRawY()
);
int x = (int) (e.getX() / mScale - mOffsetX);
int y = (int) (e.getY() / mScale- mOffsetY);
Drawable tile = hitTest(x, y);
Log.d("onToucheEvent", "tile=" + tile);
boolean retVal = mScaleDetector.onTouchEvent(e);
retVal = mGestureDetector.onTouchEvent(e) || retVal;
return retVal || super.onTouchEvent(e);
}
并将我的自定义MyView.java更改为:
Matrix
但遗憾的是我的protected void onDraw(Canvas canvas) {
mMatrix.reset();
mMatrix.setTranslate(mOffsetX, mOffsetY);
mMatrix.postScale(mScale, mScale);
canvas.setMatrix(mMatrix);
mGameBoard.draw(canvas);
for (Drawable tile: mTiles) {
tile.draw(canvas);
}
}
public boolean onTouchEvent(MotionEvent e) {
float[] point = new float[] {e.getX(), e.getY()};
Matrix inverse = new Matrix();
mMatrix.invert(inverse);
inverse.mapPoints(point);
float density = getResources().getDisplayMetrics().density;
point[0] /= density;
point[1] /= density;
Drawable tile = hitTest((int) point[0], (int) point[1]);
Log.d("onToucheEvent", "tile=" + tile);
}
找不到任何触摸过的瓷砖。