2011-03-07 20 views
6

我目前正在爲我的最後一年項目開發一個Android應用程序,該應用程序應該可以幫助自閉症患者通過觸摸人體圖片來指示什麼時候某件事會受到傷害。如何識別Android中的某個圖像區域(不僅是座標)?

我遇到的問題是我不知道如何識別它們所觸摸的圖像部分。該圖像是一個位圖,在ImageView中作爲BitmapDrawable保存。第一次被觸摸時,它通過動畫和setFilledAfter(true)進行放大,當觸摸某個區域時,應用程序應該識別身體的主要部分(例如頭部,左手...)。

要識別的區域不是正方形,因此檢查座標不是真正的選項。我正在考慮將每個部分都視爲在原始圖片上繪製的不同視圖,但我也開放了其他解決方案。

爲了讓事情更有趣一些,應用程序應該可以在手機和平​​板電腦上使用不同的設備和分辨率。

非常感謝您的幫助。這真的很需要和讚賞。

編輯

到底是什麼,我會試圖如下。我將有兩個圖像副本,一個用於顯示目的,另一個是內部的,我想要識別的區域用不同的顏色繪製。所以這個計劃是推斷我從Touch事件中獲得的座標以找出它對應的原始像素,使用Bitmap.getPixel()來確定它的顏色,然後有一個case語句返回每個部分的字符串。

我現在編碼這種權利,如果有人有興趣留言,我會後一切到底是怎樣制定出來的,我有人問它甚至此時,相應的代碼:d

由於燈罩給我一些其他選擇要考慮。

+1

@ user647899,一個非常好的主意!發佈您的解決方案,以便其他人可以從中受益,如果他們遇到同樣的問題。 – Shade 2011-03-09 08:27:53

回答

2

沒有想太多這件事,似乎你的想法 - 用覆蓋視圖來檢測觸摸 - 似乎是好的。

除此之外,座標也是一個好主意 - 您只需定義圖像的命名區域並檢查點是否在特定區域內。可能會更乏味,但與20個視圖相比,複雜性可能會更好。它也肯定比在您的應用程序中添加20個額外的視圖更快。

但最重要的是,我認爲你應該試驗一下,看看什麼適合你的具體情況,因爲一切都是猜測。

編輯:

如果你選擇使用多邊形方法,那麼你將不得不面對確定的問題點是多邊形內(see here一個簡短的說明)。

另外,關於視圖,Android中的視圖被定義爲「在屏幕上佔據空間的矩形區域」。這樣就消除了非矩形視圖的可能性。也許有可能在View中定義一個非矩形的可點擊區域,但我不知道這是否可能。

+0

感謝您的快速回復。我的兩個解決方案的問題是,這些區域不是方形的(也不是矩形的),所以座標確實是有問題的(嘗試將一個手定義爲一組座標...)。同樣,我不知道如何在Android中定義視圖不是矩形的,即使有方法,我會如何展示它們?我的意思是,我怎樣才能正確放置視圖中的每個視圖?再次感謝。 – Alex 2011-03-07 11:28:24

+0

@ user647899,看我的編輯。我認爲這個問題應該用另一個問題來解決,這取決於你選擇使用哪種方法。有關PIP問題的SO問題已經存在,所以你可以直接搜索。 – Shade 2011-03-07 11:59:54

+0

@ user647899,如果我的回答很有幫助,請考慮將其標記爲問題的選定答案。謝謝。 – Shade 2011-03-07 20:01:04

0

@亞歷克斯,謝謝你的想法,它幫助了我。這是我的解決方案實施

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ImageView imgView = (ImageView)this.findViewById(R.id.main_screen); 
    imgView.setOnTouchListener(this); 
} 

@Override 
    public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getAction(); 
     Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.red); 
     switch(action) { 
     case MotionEvent.ACTION_DOWN: 
      int x = (int)event.getX(); 
      int y = (int)event.getY(); 
      int color = bMap.getPixel(x, y) ; 
      ImageView testimage = (ImageView) findViewById(R.id.main_screen); 
      switch(color) { 
      case Color.RED: 
       testimage.setImageDrawable(getResources().getDrawable(R.layout.red)); 
       break; 
      case Color.BLUE: 
       testimage.setImageDrawable(getResources().getDrawable(R.layout.blue)); 
       break; 
      } 
      break; 
     case MotionEvent.ACTION_UP: 
      int x1 = (int)event.getX(); 
      int y1 = (int)event.getY(); 
      color = bMap.getPixel(x1, y1) ; 
      testimage = (ImageView) findViewById(R.id.main_screen); 
      testimage.setImageResource(R.drawable.draw); 
      // TODO: Rename constant upper-case. 
      final int red = 1; 
      final int blue = 2; 
      switch(color){ 
      case Color.RED: 
       Intent i = new Intent(this, NewActivity.class); 
       i.putExtra(NewActivity.EXT_COLOR, red); 
       startActivity(i); 
       break; 
      case Color.BLUE: 
       i = new Intent(this, NewActivity.class); 
       i.putExtra(NewActivity.EXT_COLOR, blue); 
       startActivity(i); 
       break; 
      } 
      break; 
     case MotionEvent.ACTION_MOVE: 
      x = (int) event.getX(); 
      y = (int)event.getY(); 
      testimage = (ImageView) findViewById(R.id.main_screen); 
      color = bMap.getPixel(x, y); 
      switch(color){ 
      case Color.RED: 
       testimage.setImageDrawable(getResources().getDrawable(R.layout.red)); 
       break; 
      case Color.BLUE: 
       testimage.setImageDrawable(getResources().getDrawable(R.layout.blue)); 
       break; 
      default: 
       testimage = (ImageView) findViewById(R.id.main_screen); 
       testimage.setImageResource(R.drawable.draw); 
       break; 
      } 
      break; 
     } 
     return true; 
    } 
相關問題