Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过自定义视图检测触摸坐标是否位于可单击区域的坐标内_Android_Android View_Touch Event - Fatal编程技术网

Android 通过自定义视图检测触摸坐标是否位于可单击区域的坐标内

Android 通过自定义视图检测触摸坐标是否位于可单击区域的坐标内,android,android-view,touch-event,Android,Android View,Touch Event,我正在尝试为我的应用程序创建一个带有可单击区域的自定义视图。这些区域相对于将填充该视图的图像像素坐标。我将这些图像放置在可绘制的nodpi上,以避免系统缩放 “我的自定义视图”获取其中一幅图像,调整其大小,保持纵横比以适合其父图像,然后将视图大小调整为结果图像的大小。因此,在这一点上,我有一个保持源的比率的视图,因此结果视图单击(onTouch event.getX和event.getY)坐标相对于原始图像像素坐标 另一方面,我拥有所有形状的坐标,这些坐标定义了活动开始时加载的xml文件中的可单

我正在尝试为我的应用程序创建一个带有可单击区域的自定义视图。这些区域相对于将填充该视图的图像像素坐标。我将这些图像放置在可绘制的nodpi上,以避免系统缩放

“我的自定义视图”获取其中一幅图像,调整其大小,保持纵横比以适合其父图像,然后将视图大小调整为结果图像的大小。因此,在这一点上,我有一个保持源的比率的视图,因此结果视图单击(onTouch event.getX和event.getY)坐标相对于原始图像像素坐标

另一方面,我拥有所有形状的坐标,这些坐标定义了活动开始时加载的xml文件中的可单击区域。这些区域由一种类型定义:圆形或矩形

圆:根据原始图像的中心x-y和半径(以像素为单位)

rect:根据原始图像以像素为单位的中心x-y、宽度和高度

现在我需要检测我的触摸x-y是否在这些区域的坐标范围内,但要记住我的原始图像所遭受的缩放


我如何检测我的触摸坐标和可点击区域坐标之间的“冲突”?我的意思是,即使不调整原始图像的大小,我该如何计算呢?

我自己也做过这样一个视图

我添加了包含图像和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;
                    }
                }
            }
        }