【问题标题】:Detect if touch coords are inside the coords of clickeable areas over a custom view检测触摸坐标是否在自定义视图上的可点击区域的坐标内
【发布时间】:2013-09-27 01:30:32
【问题描述】:

我正在尝试为我的应用创建一个带有可点击区域的自定义视图。这些区域相对于将填充该视图的图像像素坐标。我已将这些图像放在 drawable-nodpi 以避免系统缩放。

我的自定义视图采用其中一张图像,调整其大小以保持纵横比以适合其父级,然后将视图调整为结果图像的大小。所以此时我有一个保持源比例的视图,所以生成的视图点击(onTouch event.getX 和 event.getY)坐标是相对于原始图像像素坐标的。

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

圆:以原图为中心,x-y为中心,半径为px

rect:以原图为中心,以px为单位的x-y,宽高

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

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

【问题讨论】:

    标签: android android-view touch-event


    【解决方案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;   
    }
    

    因此,您使用此代码所做的是,您确定触摸是否在表示对象的 Image 的大小范围内。

    【讨论】:

    • 你可以摆脱sqrt()的调用,因为你只是测量相对距离。
    • 很抱歉,您能否再解释一下它的数学原理?我很难跟踪它。说该解决方案仅适用于矩形是否正确?
    • 实际上我将对象视为圆圈。重要的是,您正在从居中的 xCoordinate 计算 touchDistance。或者它可能会以一种奇怪的方式表现:)
    【解决方案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;
                        }
                    }
                }
            }
    

    首先,我将原始坐标按与图像缩放相同的比例缩放。然后,在 OnTouchListener 中,我计算了我的触摸距离与圆的比率,或者我的矩形的半宽和半高。

    感谢丹尼尔的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-05
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多