Android 通过自定义视图检测触摸坐标是否位于可单击区域的坐标内
我正在尝试为我的应用程序创建一个带有可单击区域的自定义视图。这些区域相对于将填充该视图的图像像素坐标。我将这些图像放置在可绘制的nodpi上,以避免系统缩放 “我的自定义视图”获取其中一幅图像,调整其大小,保持纵横比以适合其父图像,然后将视图大小调整为结果图像的大小。因此,在这一点上,我有一个保持源的比率的视图,因此结果视图单击(onTouch event.getX和event.getY)坐标相对于原始图像像素坐标 另一方面,我拥有所有形状的坐标,这些坐标定义了活动开始时加载的xml文件中的可单击区域。这些区域由一种类型定义:圆形或矩形 圆:根据原始图像的中心x-y和半径(以像素为单位) rect:根据原始图像以像素为单位的中心x-y、宽度和高度 现在我需要检测我的触摸x-y是否在这些区域的坐标范围内,但要记住我的原始图像所遭受的缩放Android 通过自定义视图检测触摸坐标是否位于可单击区域的坐标内,android,android-view,touch-event,Android,Android View,Touch Event,我正在尝试为我的应用程序创建一个带有可单击区域的自定义视图。这些区域相对于将填充该视图的图像像素坐标。我将这些图像放置在可绘制的nodpi上,以避免系统缩放 “我的自定义视图”获取其中一幅图像,调整其大小,保持纵横比以适合其父图像,然后将视图大小调整为结果图像的大小。因此,在这一点上,我有一个保持源的比率的视图,因此结果视图单击(onTouch event.getX和event.getY)坐标相对于原始图像像素坐标 另一方面,我拥有所有形状的坐标,这些坐标定义了活动开始时加载的xml文件中的可单
我如何检测我的触摸坐标和可点击区域坐标之间的“冲突”?我的意思是,即使不调整原始图像的大小,我该如何计算呢?我自己也做过这样一个视图 我添加了包含图像和x/y坐标的对象 现在,您需要有一个这些对象的列表,如果您得到一个ontouchEvent,您可以在该列表上迭代执行类似objectHit()的操作
因此,您使用此代码所做的是,您确定触摸是否在表示对象的图像大小内。这就是我最后所做的
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;
}
}
}
}
for(i=0;iYou可以摆脱sqrt()
调用,因为您只是测量相对距离。很抱歉,您能再解释一下它周围的数学吗?我很难理解它。说这个解决方案只适用于矩形是正确的吗?实际上,我认为对象是圆。重要的是,您是从中心位置计算接触距离的xCoordinate。或者它可能以一种奇怪的方式运行:)
public double getTouchAbleArea() {
return Math.sqrt(Math.pow(getBitmap().getHeight(),2)+Math.pow(getBitmap().getWidth(),2))/2;
}
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;
}
}
}
}