如何识别Android中触摸的图像区域(而不仅仅是坐标)?

时间:2011-03-07 09:55:27

标签: android view bitmap touch

我目前正在为我的最后一年项目开发一个Android应用程序,这应该可以帮助自闭症患者通过触摸人体图片来指示什么时候有什么疼痛。

我遇到的问题是我不知道如何识别他们触摸的图像部分。图像是位图,在ImageView中作为BitmapDrawable保存。第一次被触摸,它通过动画和setFilledAfter(true)放大,当触摸一个区域时,应用程序应该识别身体的主要部分(例如头部,左手......)。

要识别的区域不是方形的,因此检查坐标不是一个真正的选择。我正在思考如何将每个部分识别为在原始图片之上绘制的不同视图,但我也开放了其他解决方案。

为了让事情更有趣,应用程序应该可以在手机和平​​板电脑上的不同设备和分辨率上运行。

非常感谢您的帮助。这真的是需要和赞赏的。

修改

最后我将尝试的是以下内容。我将有两个图像副本,一个用于显示目的,另一个用于内部,我想要识别的区域用不同颜色绘制。所以计划是推断我从Touch事件获得的坐标,找出它对应于原始的像素,使用Bitmap.getPixel()来确定它的颜色,然后有一个case语句返回每个部分的字符串。

我正在对此进行编码,如果有人有兴趣留言,我会发布一切是如何解决的,而且我有人要求它甚至是合适的代码:D

感谢Shade给了我一些其他选择。

2 个答案:

答案 0 :(得分:2)

如果不考虑这个问题,似乎你的想法 - 用叠加视图检测触摸 - 似乎很好。

除此之外,坐标也是一个好主意 - 你只需要定义图像的命名区域并检查触摸点是否在某个区域内。可能有点繁琐,但与20个视图相比,在复杂性方面可能更好。它肯定比在您的应用程序中添加20个额外视图更快。

但最重要的是,我认为你应该尝试并看看什么适合你的具体情况,因为其他一切都是猜测。

编辑:

如果您确实选择使用多边形方法,则必须处理确定点是否在多边形内的问题(see here以获得简短说明)。

此外,关于视图,Android中的视图被定义为“占据屏幕空间的矩形区域”。这样就消除了非矩形视图的可能性。也许你有可能在View中定义一个非矩形的可点击区域,但我不知道这是否可能。

答案 1 :(得分:0)

@Alex,谢谢你的想法,这对我很有帮助。这是我对您的解决方案的实施

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