2011-03-07 21 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; 
    } 
相关问题