2014-12-01 67 views
1

我有一个自定义视图,我想知道是否有任何chace,我可以检测,如果我的视图以外的东西被点击。它必须在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); 
} 
+0

显示一些代码,了解它是如何实现的!为什么它需要在你的View类中? – Carnal 2014-12-01 20:35:37

+0

因为我正在制作一个自定义的PieChart视图,并且我希望当视图离焦的时候饼图确实做不到,但我无法真正解释,但这是拼图的最后一部分。 – 2014-12-01 20:36:32

+0

你使用片段还是活动?您可以将clicklistener(s)实施到不包含您的视图的其他视图。并让这些clicklistener(s)在你的View中运行一个方法。 – Carnal 2014-12-01 20:40:18

回答

1

ViewgetHitRect(Rect)方法。您可以使用它来检索该视图的命中,并且您可以使用该矩形检查它在其中的MotionEvent。例如

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

} 
+0

但我无法从视图内的整个屏幕检测到运动事件。 – 2014-12-01 20:43:04

+1

还有其他方法吗? – 2014-12-01 20:51:09

+0

使用代码“getGlobalVisibleRect(rect)”代替“getHitRect(rect)” – 2018-01-11 09:30:46