我在我的一个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,这里是一张图片。不清楚:
答案 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;
}
}
这样做是检查运动事件是否发生在该区域的范围内。