我目前正在为我的最后一年项目开发一个Android应用程序,它应该可以帮助自闭症患者在什么时候受伤,并通过触摸人体图片来做到这一点。
我遇到的问题是,我不知道如何识别他们触摸的图像部分。图像是位图,作为ImageView中的BitmapDrawable保存。第一次被触摸时,它会通过动画和setFilledAfter(真的)放大,从那里当一个区域被触摸时,应用程序应该识别身体的主要部位(例如头部,左手...)。
要识别的区域不是方形的,因此检查坐标并不是一个真正的选择。我一直在考虑让每个部分都被识别为在原始图片上绘制的不同视图,但我也对其他解决方案持开放态度。
为了让事情变得更有趣,这款应用程序应该在不同的设备和分辨率上运行,无论是手机还是平板电脑。
非常感谢您的帮助。这真的是需要和欣赏的。
编辑
最后,我将尝试以下内容。我将有两份图像副本,一份用于展示,另一份在内部,我希望识别的区域被绘制成不同的颜色。因此,我们的计划是推断我从Touch事件中获得的坐标,以找出它对应于原始图像的像素,使用Bitmap.getPixel()来确定它是什么颜色,然后使用一个case语句返回每个部分的字符串。
我现在正在编写代码,如果有人对此感兴趣,请留言,我将发布每件事是如何解决的,我有人要求它,甚至正确的代码:D
感谢Shade给了我一些其他的选择来考虑。
发布于 2011-03-07 18:35:37
没有过多地考虑这一点,似乎你的想法-检测覆盖视图的接触-似乎是好的。
除此之外,坐标也是一个好主意-你只需要定义图像的命名区域,并检查接触点是否在某个区域内。可能会有点乏味,但与拥有20个视图相比,在复杂性方面可能会更好。它也肯定比在应用程序中添加20个额外的视图更快。
但最重要的是,我认为你应该进行实验,看看什么适合你的具体情况,因为其他一切都是猜测。
编辑:
如果选择使用多边形方法,则必须处理确定点是否位于多边形内部的问题(简短解释为see here)。
另外,关于视图,Android中的视图被定义为“占据屏幕空间的矩形区域”。因此,这消除了非矩形视图的可能性。也许你有可能在View中定义一个非矩形的可点击区域,但我不知道这是否可能。
发布于 2012-05-29 05:00:39
@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;
}
https://stackoverflow.com/questions/5218184
复制相似问题