【发布时间】:2014-12-01 20:32:39
【问题描述】:
我有一个自定义视图,我想知道,如果点击了我的视图之外的东西,我是否可以检测到任何机会。它必须在 View 类中,否则它无法按我的预期工作!
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) 在您的视图中运行一个方法。
-
不,视图是一个独立的东西,我正在为自己制作一些自定义视图。