2013-09-16 88 views
2

我正在尝试使用可触摸区域为我的应用创建自定义视图。这些区域与填充该视图的图像像素坐标有关。我已经将这些图像放置在drawable-nodpi处,以避免系统缩放。检测触摸坐标是否位于自定义视图上可触摸区域的坐标内

我的自定义视图使用其中一个图像,调整其大小以保持宽高比适合其父图像,然后将视图大小调整为所得图像的大小。所以在这一点上,我有一个视图保持源的比例,所以生成的视图单击(onTouch event.getX和event.getY)坐标是相对于原始图像像素坐标。

从另一方面,我有所有的形状的坐标,定义一个xml文件中的clickeable区域,我加载时,我的活动开始。这些区域由类型:circle或rect定义。中心XY,根据原始图像

现在我需要检测是否我的触摸XY是宽度和高度PX:

圈:根据原始图像

矩形中心XY和半径PX在任何这些区域的坐标内,但要记住我的原始图像遭受的缩放。

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

回答

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中,我计算了我的触摸距离与圆的比例,或者矩形的半高和半高。

谢谢丹尼尔的帮助!

1

我已经作出了查看这样自己,

我加入含有的图像对象和X/Y COORDS。

现在u需要有这些对象的列表,如果你得到的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(); 
} 

你实现getTouchableArea的对象basicly的同样的方式。

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

所以你用这个代码做的是,你确定触摸是否表示对象的图像的尺寸范围内。

+0

您可以摆脱'sqrt()'调用,因为您只测量相对距离。 – Geobits

+0

对不起,但你能解释一下它的数学吗?我无法遵守它。说这个解决方案只适用于矩形是正确的吗? –

+0

实际上我认为的物体作为圈子。重要的是,你正在计算中心xCoordinate的touchDistance。或者它可能表现得很奇怪:) –