Вот как это делается. Предположим, у вас есть свои очки, сделайте их глобальными:
PointF topLeft = new PointF(10,10);
PointF topRight = new PointF(90,10);
PointF bottomLeft = new PointF(10,90);
PointF bottomRight = new PointF(90,90);
Что вам нужно сделать, так это создать RectF вокруг каждой точки. Чем больше RectF, тем больше зона касания точки.
float sizeOfRect = 5f;
RectF topLeftTouchArea = new RectF(topLeft.x - sizeOfRect, topLeft.y - sizeOfRect, topLeft.x + sizeOfRect, topLeft.y + sizeOfRect);
//Do this for the other points too
Определите несколько глобальных объектов, чтобы отслеживать, что пользователь делает в onTouch. Один int - это касающийся угла, а четыре других - идентификаторы углов.
private final int NONE = -1, TOUCH_TOP_LEFT = 0, TOUCH_TOP_RIGHT = 1, TOUCH_BOT_LEFT = 2, TOUCH_BOT_RIGHT = 3;
int currentTouch = NONE;
Теперь в событии onTouch вы можете проверить, к какой точке прикасается ваш пользователь, вот так:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
//The user just put their finger down.
//We check to see which corner the user is touching
//And set our global, currentTouch, to the appropriate constant.
case MotionEvent.ACTION_DOWN:
if (topLeftTouchArea.contains(event.getX(), event.getY()) {
currentTouch = TOUCH_TOP_LEFT;
} else if (topRightTouchArea.contains(event.getX(),event.getY()) {
currentTouch = TOUCH_TOP_RIGHT;
} else if (botLeftTouchArea.contains(event.getX(),event.getY()) {
currentTouch = TOUCH_BOT_LEFT;
} else if (botRightTouchArea.contains(event.getX(), event.getY()) {
currentTouch = TOUCH_BOT_RIGHT;
} else {
return false; //Return false if user touches none of the corners
}
return true; //Return true if the user touches one of the corners
//Now we know which corner the user is touching.
//When the user moves their finger, we update the point to the user position and invalidate.
case MotionEvent.ACTION_MOVE:
switch (currentTouch) {
case TOUCH_TOP_LEFT:
topLeft.x = event.getX();
topLeft.y = event.getY();
//The bottom left x position has to move with the top left corner
bottomLeft.x = topLeft.x;
//The top right y position has to move with the top left corner
topRight.y = topLeft.y;
invalidate();
return true;
case TOUCH_TOP_RIGHT:
topRight.x = event.getX();
topRight.y = event.getY();
//The top left y position has to move with the top right corner
topLeft.y = topRight.y;
//The bottom right x position has to move with the top right corner
bottomRight.x = topRight.x;
invalidate();
return true;
case TOUCH_BOT_LEFT:
bottomLeft.x = event.getX();
bottomLeft.y = event.getY();
bottomRight.y = bottomLeft.y;
topLeft.x = bottomLeft.x;
invalidate();
return true;
case TOUCH_BOT_RIGHT:
bottomRight.x = event.getX();
bottomRight.y = event.getY();
topRight.x = bottomRight.x;
bottomLeft.y = bottomRight.y;
invalidate();
return true;
}
//We returned true for all of the above cases, because we used the event
return false; //If currentTouch is none of the above cases, return false
//Here the user lifts up their finger.
//We update the points one last time, and set currentTouch to NONE.
case MotionEvent.ACTION_UP:
switch (currentTouch) {
case TOUCH_TOP_LEFT:
topLeft.x = event.getX();
topLeft.y = event.getY();
//The bottom left x position has to move with the top left corner
bottomLeft.x = topLeft.x;
//The top right y position has to move with the top left corner
topRight.y = topLeft.y;
invalidate();
currentTouch = NONE;
return true;
case TOUCH_TOP_RIGHT:
topRight.x = event.getX();
topRight.y = event.getY();
//The top left y position has to move with the top right corner
topLeft.y = topRight.y;
//The bottom right x position has to move with the top right corner
bottomRight.x = topRight.x;
invalidate();
currentTouch = NONE;
return true;
case TOUCH_BOT_LEFT:
bottomLeft.x = event.getX();
bottomLeft.y = event.getY();
bottomRight.y = bottomLeft.y;
topLeft.x = bottomLeft.x;
invalidate();
currentTouch = NONE;
return true;
case TOUCH_BOT_RIGHT:
bottomRight.x = event.getX();
bottomRight.y = event.getY();
topRight.x = bottomRight.x;
bottomLeft.y = bottomRight.y;
invalidate();
currentTouch = NONE;
return true;
}
return false;
}
}
Это делает прямоугольник вокруг вашей точки. Представьте себе, что вокруг ваших точек на картинке нарисованы рамки. Это «сенсорные панели», созданные объектами Rect. Размер прямоугольника устанавливается sizeOfRect. В onTouchEvent он проверяет каждый объект прямоугольника, чтобы увидеть, находится ли прикосновение пользователя внутри прямоугольника, сигнализируя пользователю о попытке прикоснуться к этой точке.
person
Zaid Daghestani
schedule
05.06.2012