从MotionEvent X获取视图,Y

时间:2015-10-20 07:39:16

标签: android events view

有没有办法在Activity.dispatchTouchEvent(MotionEvent ev)中获取对被触摸视图的引用?

如果用户点击不是EditText的任何地方,我需要隐藏自定义RelativeLayout“Keyboard”。因为我正在使用活动,并且许多片段都有许多视图组,并且每个组都拥有许多视图,其中一些是EditTexts,所以在每个子视图或子视图组上设置onTouchEvent都是太多的工作。

在MainActivity中,我认为这是一个很好的方法。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (mKeyboardLike.getVisibility() == View.VISIBLE) {
        if (!isTouchedEditText(ev.getRawX(), ev.getRawY())) {
            mKeyboardLike.setVisibility(View.GONE);
        }
    }
    return super.dispatchTouchEvent(ev);
}
private boolean isTouchedEditText(int x, int y){//viewFound instanceOf EditText; return true;}

1 个答案:

答案 0 :(得分:0)

我认为这应该可以帮到你:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    int x = Math.round(ev.getX());
    int y = Math.round(ev.getY());
    for (int i = 0; i < getChildCount(); i++) {
        if (isEditText(x, y, getChildAt(i))) {
            return true;
        }
    }

    return true;
}

public boolean isEditText(int x, int y, View view) {
    if (view instanceof ViewGroup) {
        for (int i = 0; i < getChildCount(); i++) {
            if (isEditText(x, y, ((ViewGroup) view).getChildAt(i))) {
                return true;
            }
        }
    } else if (view instanceof EditText) {
        if (x > view.getLeft() && x < view.getRight() && y > view.getTop() && y < view.getBottom()) {
            return true;
        }
    }
    return false;
}