让它工作!
对于遇到相同问题的每个人,请随时将此示例代码作为帮助:)
我一开始声明的东西
Vector<Point> points = new Vector<Point>();
Bitmap[] monsterTypes = new Bitmap[3];
Vector<Integer> distanceMovedX = new Vector<Integer>();
Vector<Integer> distanceMovedY = new Vector<Integer>();
int mNewX = -1;
int mNewY = -1;
OnTouch 方法
public boolean onTouch(View view, MotionEvent event) {
mNewX = (int) FloatMath.floor(event.getX());
mNewY = (int) FloatMath.floor(event.getY());
boolean touchedPoint = touchedPoint(mNewX, mNewY);
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
distanceMovedX.add(mNewX);
distanceMovedY.add(mNewY);
break;
case MotionEvent.ACTION_UP:
isMoveEvent = isMoveEvent();
if (isMoveEvent) {
for (Point point : points) {
if (point.spotted) {
// Your code
}
i++;
}
} else {
if (touchedPoint) {
for (Point point : points) {
if (point.spotted) {
// Your code
}
}
}
}
distanceMovedX.clear();
distanceMovedY.clear();
return true;
}
return true;
}
接触点法
public boolean touchedPoint(int mNewX, int mNewY) {
boolean touchedPoint = false;
int height = 0;
int width = 0;
for (Point point : points) {
height = monsterTypes[point.TYPE - 1].getHeight();
width = monsterTypes[point.TYPE - 1].getWidth();
if (point.x + width < mNewX || point.x > mNewX + width
|| point.y + height < mNewY || point.y > mNewY + height) {
touchedPoint = false;
point.spotted = false;
} else {
touchedPoint = true;
point.spotted = true;
return touchedPoint;
}
}
return touchedPoint;
}
isMoveEvent-方法
public boolean isMoveEvent() {
boolean isMoveEvent = false;
boolean isMoveEventX = false;
boolean isMoveEventY = false;
for (int i = 0; i <= (points.size() -1); i++) {
Log.d("point", "for loop entered");
if (!distanceMovedY.isEmpty()) {
Log.d("point.x", "distanceMovedY is not empty");
int dMY = distanceMovedY.get(distanceMovedY.size() - 1) - distanceMovedY.get(0);
if ((dMY > 50 || dMY <= 0) && dMY != 0) {
Log.d("point.y", "is move event");
Log.d("point.y", "dMY: " + dMY);
isMoveEventY = true;
} else {
Log.d("point.x", "is no move event");
Log.d("point.x", "dMY: " + dMY);
isMoveEvent = false;
return isMoveEvent;
}
}
if (!distanceMovedX.isEmpty()) {
Log.d("point.x", "distanceMovedX is not empty");
int dMX = distanceMovedX.get(distanceMovedX.size() - 1) - distanceMovedX.get(0);
if (dMX <= 50 && dMX >= -50 && dMX != 0) {
Log.d("point.x", "is move event");
Log.d("point.x", "dMX: " + dMX);
isMoveEventX = true;
} else {
Log.d("point.x", "is no move event");
Log.d("point.x", "dMX: " + dMX);
isMoveEvent = false;
return isMoveEvent;
}
}
if (isMoveEventX && isMoveEventY) {
Log.d("point", "is move event");
isMoveEvent = true;
return isMoveEvent;
}
}
Log.d("point", "is no move event");
return isMoveEvent;
}
点类
类点 { int x, y; 整数类型;布尔值;boolean halfSpotted;
public Point() {
}
public Point(int x, int y, int t) {
this.x = x;
this.y = y;
this.TYPE = t;
}
@Override
public String toString() {
return x + ", " + y;
}
}
解释:
点:我们得到了一个班级点。Vector 中声明的所有这些点都是画布上的 x 和 y 坐标。他们帮助我们检查我们点击的位置。
MonsterTypes:它是我使用的不同图形。如果您只使用在画布上绘制的一个图形,请将其更改为您的需要
distanceMovedX & Y:保存“ACTION_MOVE”的所有 X 和 Y 坐标。从 pos 0(第一个接触点)到 pos Z(最后一个接触点,ACTION_UP 发生的地方)。虽然它不是原来的 X 和 Y 位置。它是 posZ - pos0 的结果。使用这些值,您可以确定在经过多远的距离后要调用“onMove”,然后在以下距离应调用“onClick”。
mNewX & Y:onTouch-Method 的当前位置。每次您移动手指时,newX 和 Y 都会被覆盖。
方法:
onTouch():首先,我们将 mNewX 和 Y 覆盖到当前触摸的位置。然后我们检查我们是否点击了一个现有的点(在我的例子中是一些 48px*48px 的区域)接下来我们在 ACTION_MOVE 中记录所拍摄的距离。之后,我们继续 ACTION_UP,检查我们是否刚刚执行了一些 moveEvent 或 clickEvent。
touchPoint():计算我们是否触摸了画布上的某个现有点。返回真或假
isMoveEvent():检查我们是否移动了一定距离。就我而言,我想向下移动 50 像素或更多。虽然我不允许向侧面移动 -50px 或 +50px。如果它不是移动事件,则最后触摸的点仍然必须在给定距离内(在我的情况下,在该点的 48px*48px 范围内)。
就是这样。我花了好几天才弄清楚那个选项;/为此感到羞耻......虽然我编码得很快,但是是什么让我再次感觉更好:D