视图的子项上的hitTest - 如何翻译MotionEvent坐标

时间:2014-11-01 10:59:05

标签: android coordinates ontouchevent motionevent

作为Android编程新手我试图找出,如果用户在自定义视图(源代码:MyView.java)触摸了一个孩子(下图中左边的黄色图块):

Foto

对于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属性(我不想使用ViewView.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); } 找不到任何触摸过的瓷砖。

0 个答案:

没有答案