我正在尝试为我的应用制作一个带有可拼接区域的自定义视图。这些区域相对于将填充该视图的图像像素坐标。我把这些图像放在drawable-nodpi上以避免系统缩放。
我的自定义视图会拍摄其中一张图片,调整大小以保持宽高比以适合其父级,然后将视图大小调整为生成图像的大小。所以此时我有一个视图来维持源的比例,因此生成的视图点击(onTouch event.getX和event.getY)坐标是相对于原始图像的像素坐标。
另一方面,我拥有形状的所有坐标,这些坐标定义了我在活动开始时加载的xml文件中的可拼接区域。这些区域由类型定义:circle或rect。
circle:根据原始图像中心x-y和px中的半径
rect:根据原始图像以px为中心x-y,宽度和高度
现在我需要检测我的触摸x-y是否在任何这些区域的坐标内,但要记住我的原始图像所遭受的缩放。
我怎样才能检测到我的触摸坐标和可拼接区域之间的“碰撞”?我的意思是即使没有调整原始图像的大小,我该如何计算呢?
答案 0 :(得分:1)
我自己制作了这样的视图,
我添加了包含图像和x / y坐标的对象。
现在你需要有一个这些对象的列表,如果你得到一个ontouchEvent,你迭代该列表做一些像objectHit()
public boolean objectHit(int x, int y){
int touchdistance = Math.sqrt((double)(this.getX()-x)*(double)(this.getX()-x)) + ((double)(this.getY()-y)*(double)(this.getY()-y));
return touchdistance <= this.getTouchableArea();
}
并且基本上以相同的方式为Object实现getTouchableArea。
public double getTouchAbleArea() {
return Math.sqrt(Math.pow(getBitmap().getHeight(),2)+Math.pow(getBitmap().getWidth(),2))/2;
}
因此,您使用此代码执行的操作是,确定触摸是否在表示对象的图像大小范围内。
答案 1 :(得分:0)
这就是我最终做的事情
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;
}
}
}
}
首先,我按照与我的图像缩放相同的比例缩放原始坐标。然后,在OnTouchListener中,我计算了我的触摸距离与圆的比例,或者我的矩形的半宽和半高的距离。
感谢Daniel的帮助!