得到它的工作!
对于有同样的问题感到沉沦,随意采取此示例代码为帮助:)
的东西,我在开始的时候宣布
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;
}
touchedPoint-Method
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;
}
点类
类Point { INT的x,y; int TYPE; boolean spotted; 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;
}
}
说明:
点: 我们得到了一个类Point。 Vector中声明的所有点都是画布上的x坐标和y坐标。他们帮助我们检查我们点击的位置。
monsterTypes: 它使用不同的图形。如果您只使用一个绘制在画布上的图形,请将其更改为您的需要
distanceMovedX & Y: 保存“ACTION_MOVE”的所有X和Y坐标。从pos 0(第一个触摸点)到pos Z(最后一个触摸点,其中发生ACTION_UP)。虽然它不是原来的X和Y位置。它是posZ - pos0的结果。 有了这些值,你可以确定,行驶了多长距离后,你想调用“onMove”和BELOW,应该调用哪个距离“onClick”。
mNewX & Y: 您的onTouch-Method的当前位置。每当您移动手指时,newX & Y都会被覆盖。
方法:
onTouch(): 首先,我们将覆盖mNewX和Y当前位置感动。然后我们检查是否点击了一个现有点(在我的情况下是48px * 48px区域) 接下来我们在ACTION_MOVE中记录所拍摄的距离。 之后,我们继续ACTION_UP,在那里我们检查我们是否执行了一些moveEvent或clickEvent。
touchedPoint(): 计算是否触摸画布上的某个现有点,或者不是。返回true或false
isMoveEvent(): 检查我们是否移动了一定的距离。在我的情况下,我想下移,50px或更多。虽然我不允许侧向移动-50px或+ 50px。如果它不是一个移动事件,最后一个点仍然必须在给定的距离(在我的情况下在该点的48px * 48px范围内)。
就是这样。花了我几天的时间才找出这个选择; /羞愧的那个...虽然我编码它很快,让我感觉更好:D
老实说,这不是完美的样本,因为任何其他移动事件(侧向或向上)都会被忽略。只需在ifMoveEvent()方法中添加另一个If-clause子句 - 方法 – JustBasti 2012-08-13 18:53:49