Android中的区域,基本触控实现

时间:2014-07-24 15:09:04

标签: android ontouchlistener region

我在我的一个earlier questions中发现设置特定的x,y坐标,因为Touch Listeners太具体了,而且只有一个位置太小而无法接收触摸输入。

@ligi在我的问题评论中提到Regions。我调查了一下,发现它是我需要的,我只是无法找到如何实现它。

以下是特定x,y坐标的TouchListener代码:

public boolean onTouchEvent(MotionEvent ev) {
    if (!mDragging) {
        return false;
    }

    int x = (int) ev.getX();
    int y = (int) ev.getY();

    if (x == 100 && y == 200) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.e(TAG, "ACTION DOWN");
            break;

        case MotionEvent.ACTION_MOVE:
            Log.e(TAG, "ACTION MOVE");
            break;

        case MotionEvent.ACTION_UP:
            Log.e(TAG, "ACTION UP");
            break;
        }
    }

有人知道如何设置区域吗?假设用户手指移动到区域区域,做一些事情。我无法在其他任何地方找到任何基本实现。

如果是desc,这里是一张图片。不清楚:

2 个答案:

答案 0 :(得分:1)

我想你会在Android中使用rect。您可以指定矩形并查看rect(s)是否包含您的值。在下面的例子中,我制作了一个矩形列表,因此有多个热点。理想情况下,如果只需要一个特定的矩形区域,就可以使用一个。 .contains内部方法允许您指定x,y坐标可能包含的区域。

 List<Rect> retangles;

...

 for(Rect rect : rectangles){
    if(rect.contains(x,y)){
        System.out.println("Touched Rectangle, do what you need to do.");
     }
 }

或只有一个

  Rect rect = new Rect(0, 0, 200, 100);

  if(rect.contains(x,y))
    System.out.println("Touched Rectangle, do what you need to do.");

答案 1 :(得分:1)

你可以做这样的事情

public boolean onTouchEvent(MotionEvent ev) {

    int x = (int) ev.getX();
    int y = (int) ev.getY();

    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            Log.e(TAG, "ACTION DOWN OR MOVE");

            // check if the event is in region 1
            if(x >= "left_x_region1" && x <= "right_x_region1"
                && y >= "top_x_region1" && y <= "bottom_x_region1")
                // do something for region1

            // check if the event is in region 2
            else if(x >= "left_x_region2" && x <= "right_x_region2"
                && y >= "top_x_region2" && y <= "bottom_x_region2")
                // do something for region1

            // continue for other cases
            break;
        case MotionEvent.ACTION_UP:
            Log.e(TAG, "ACTION UP");
            break;
    }
}

或者您可以通过列出这些实际值的列表来进一步简化它,或者甚至更好地从这些值创建Rects

List<Rect> regions = new ArrayList<Rect>();
regions.add(new Rect("left_x_region1", "top_y_region1", "right_x_region1", "bottom_y_region1");
regions.add(new Rect("left_x_region2", "top_y_region2", "right_x_region2", "bottom_y_region2");
// continue for each region

然后在ACTION_DOWN ||内的那些区域检查您的活动switch语句的ACTION_MOVE部分

for(int i = 0; i < regions.size(); i++){
    if(regions.get(i).contains(x, y)){
       // do stuff for region i
       return;
    }
}

这样做是检查运动事件是否发生在该区域的范围内。