检测触摸线是否位于自定义视图上的可点击区域的坐标内

时间:2013-09-16 18:53:07

标签: android android-view ontouchevent

我正在尝试为我的应用制作一个带有可拼接区域的自定义视图。这些区域相对于将填充该视图的图像像素坐标。我把这些图像放在drawable-nodpi上以避免系统缩放。

我的自定义视图会拍摄其中一张图片,调整大小以保持宽高比以适合其父级,然后将视图大小调整为生成图像的大小。所以此时我有一个视图来维持源的比例,因此生成的视图点击(onTouch event.getX和event.getY)坐标是相对于原始图像的像素坐标。

另一方面,我拥有形状的所有坐标,这些坐标定义了我在活动开始时加载的xml文件中的可拼接区域。这些区域由类型定义:circle或rect。

circle:根据原始图像中心x-y和px中的半径

rect:根据原始图像以px为中心x-y,宽度和高度

现在我需要检测我的触摸x-y是否在任何这些区域的坐标内,但要记住我的原始图像所遭受的缩放。

我怎样才能检测到我的触摸坐标和可拼接区域之间的“碰撞”?我的意思是即使没有调整原始图像的大小,我该如何计算呢?

2 个答案:

答案 0 :(得分:1)

我自己制作了这样的视图,

我添加了包含图像和x / y坐标的对象。

现在你需要有一个这些对象的列表,如果你得到一个ontouchEvent,你迭代该列表做一些像objectHit()

public boolean objectHit(int x, int y){
   int touchdistance = Math.sqrt((double)(this.getX()-x)*(double)(this.getX()-x)) + ((double)(this.getY()-y)*(double)(this.getY()-y));
   return touchdistance <= this.getTouchableArea();
}

并且基本上以相同的方式为Object实现getTouchableArea。

public double getTouchAbleArea() {
    return Math.sqrt(Math.pow(getBitmap().getHeight(),2)+Math.pow(getBitmap().getWidth(),2))/2;   
}

因此,您使用此代码执行的操作是,确定触摸是否在表示对象的图像大小范围内。

答案 1 :(得分:0)

这就是我最终做的事情

for(i=0;i<level.getDiffs();i++){
            DifferencesData diff = level.getDifference(i);

            if(!diff.getFinded()){
                x = diff.getX();
                y = diff.getY();

                if(diff.getType() == 0){
                    double d = Math.sqrt(Math.pow(x - event.getX(),2) + Math.pow(y - event.getY(),2));

                    if(d <= diff.getRadius()){
                        hit = true;
                        break;
                    }
                }else{
                    double dx = Math.sqrt(Math.pow(x - event.getX(),2));
                    double dy = Math.sqrt(Math.pow(y - event.getY(),2));

                    if(dx <= (diff.getWidth() / 2) && dy <= (diff.getHeight() / 2)){
                        hit = true;
                        break;
                    }
                }
            }
        }

首先,我按照与我的图像缩放相同的比例缩放原始坐标。然后,在OnTouchListener中,我计算了我的触摸距离与圆的比例,或者我的矩形的半宽和半高的距离。

感谢Daniel的帮助!