2

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

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

另一方面,我拥有定义活动开始时加载的 xml 文件中可点击区域的形状的所有坐标。这些区域由一种类型定义:圆形或矩形。

circle:根据原始图像以 px 为单位的中心 xy 和半径

rect:根据原图以px为单位居中xy,宽高

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

如何检测我的触摸坐标和可点击区域坐标之间的“碰撞”?我的意思是,即使不调整原始图像的大小,我该如何计算?

4

2 回答 2

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;   
}

因此,您使用此代码所做的是,您确定触摸是否在表示对象的 Image 的大小范围内。

于 2013-09-16T19:04:20.810 回答
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 中,我计算了我的触摸距离与圆的比率,或者我的矩形的半宽和半高。

谢谢丹尼尔的帮助!

于 2013-09-26T17:30:32.883 回答