2013-09-16 130 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。或者它可能表現得很奇怪:) –