【问题标题】:Detect touch outside of View检测视图外的触摸
【发布时间】:2014-12-01 20:32:39
【问题描述】:

我有一个自定义视图,我想知道,如果点击了我的视图之外的东西,我是否可以检测到任何机会。它必须在 View 类中,否则它无法按我的预期工作!

完整文件:https://github.com/Nicba1010/AndroidLibrary/blob/master/src/com/nicba1010/utils/views/PieChartView.java

OnTouchEvent(所以你知道我做了什么)

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
        selected = null;
        invalidate();
        return true;
    }
    double deltaX = event.getX() - rect.width() / 2 - rect.left;
    double deltaY = -(event.getY() - rect.height() / 2 - rect.top);
    double fromMid = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
    boolean inCircle = fromMid < (rectSelect.bottom / 2);
    if (inCircle) {
        double angleInDegrees = getPositionOnCircumference(deltaX, deltaY);
        float percentage = (float) (angleInDegrees / 360f);
        float totalPerc = 0;
        int index = -1, i = 0;
        for (PieChartSlice e : slices) {
            if (percentage > totalPerc) {
                index = i;
            } else if (percentage < totalPerc) {
                break;
            }
            totalPerc += e.getPercentage();
            i++;
        }
        if (index == -1) {
            Toast.makeText(getContext(), "ERROR", Toast.LENGTH_LONG).show();
        } else {
            final PieChartSlice tmp = slices.get(index);
            addScaleTask(rect, 500, 0.9f, new Runnable() {
                @Override
                public void run() {
                    selected = tmp;
                }
            });
            selected = slices.get(index);
            invalidate();
            Toast.makeText(getContext(), selected.getName(),
                    Toast.LENGTH_SHORT).show();
            onSliceSelectedListener.onSliceSelected(this, selected);
        }
    } else {
        if (selected != null) {
            addScaleTask(rect, 500, 1f, new Runnable() {
                @Override
                public void run() {
                    selected = null;
                }
            });
            invalidate();
        }
    }
    return super.onTouchEvent(event);
}

【问题讨论】:

  • 展示你如何实现它的一些代码!为什么它需要在你的 View 类中?
  • 因为我正在制作一个自定义 PieChart 视图,并且我希望当视图散焦时饼图会做某事,我无法真正解释,但这是拼图的最后一块。
  • 你使用的是 Fragment 还是 Activity?您可以将 clicklistener(s) 实现到不包含您的视图的其他视图。并让这些 clicklistener(s) 在您的视图中运行一个方法。
  • 不,视图是一个独立的东西,我正在为自己制作一些自定义视图。

标签: android view touch


【解决方案1】:

View 具有 getHitRect(Rect) 方法。您可以使用该视图的矩形来检索它,您可以使用该矩形来检查它在其中的 MotionEvent。比如

Rect rect = new Rect();
getHitRect(rect); 
if (rect.contains((int) event.getX(), (int) event.getY()) {

}

【讨论】:

  • 但我无法从视图内的整个屏幕检测到运动事件。
  • 还有其他办法吗?
  • 使用代码“getGlobalVisibleRect(rect)”代替“getHitRect(rect)”
猜你喜欢
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多