2014-12-01 64 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