動作するようになりました。
同じ問題を抱えている人は、このサンプル コードを参考にしてください :)
最初に宣言したこと
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-メソッド
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; int タイプ; ブール値の斑点; ブール値の 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;
}
}
説明:
ポイント: クラス ポイントを取得しました。ベクターで宣言されたすべてのポイントは、キャンバス上の x 座標と y 座標です。クリックした位置を確認するのに役立ちます。
MonsterTypes: 私が使用するさまざまなグラフィックです。キャンバスに描画するグラフィックを 1 つだけ使用する場合は、必要に応じて変更します
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 を実行したかどうかを確認します。
touchedPoint(): キャンバス上の既存のポイントに触れたかどうかを計算します。true または false を返します
isMoveEvent(): 特定の距離を移動したかどうかを確認します。私の場合、50px以上下に移動したいです。-50px または +50px の横への移動は許可されていません。移動イベントではない場合、最後に触れたスポットは、指定された距離内にある必要があります (私の場合、ポイントの 48px*48px の範囲内)。
それでおしまい。そのオプションを理解するだけで何日もかかりました;/それを恥じています...私はそれをかなり速くコーディングしましたが、私は再び気分が良くなります:D