当前位置: 首页 > 面试题库 >

获取相对于视图的触摸坐标(等效于ScreenToClient?)

钱浩荡
2023-03-14
问题内容

我在Android应用程序中向用户显示图像。

我希望能够告诉他们“触摸”图像的位置。

我可以通过实现OnTouchListener轻松获取屏幕坐标

 private OnTouchListener image_Listener = new OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP) {
            float x = event.getX();
            float y = event.getY();
            return true;
        }
        return false;
    }
};

但是,这些是绝对坐标。我真正需要的是一个将其转换为相对于View的坐标的函数。

我做了一些挖掘工作,但是除了尝试自己实现ScreenToClient方法之外,我似乎什么也没做。

有谁知道一个好的解决方案,还是我只需要自己动手?

似乎可以使用的一种方法-这就是为什么我要问。

谢谢大家的时间。

编辑:我不太确定坐标是否已经相对于视图。我本来会发誓说坐标是绝对的,但是经过一番修补后-我的工作已经按预期进行了。.对不起那些讨厌的家伙。


问题答案:

只是为了回答,触摸在某种程度上是相对于视图的。是的,它们是触摸的原始屏幕坐标。但是,由于您将触摸事件注册到视图本身,因此只有在用户实际触摸视图时才会触发。这意味着,即使屏幕坐标是原始屏幕坐标,它们也位于视图本身的范围内。

如果只想获取触摸视图相对于自身的x / y坐标,则可以将屏幕坐标和顶部坐标从y坐标中减去左坐标,如下所示:

private OnTouchListener image_Listener = new OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP) {
            float screenX = event.getX();
            float screenY = event.getY();
            float viewX = screenX - v.getLeft();
            float viewY = screenY - v.getTop();
            return true;
        }
        return false;
    }
};

这样,如果用户在屏幕上触摸了40个x像素,但左侧边距设置为10,viewX则将为30。如果您将视图下移40个x像素,并且用户在视图中触摸了同一点,仍然是30。

如果您将填充包括在内,则它会变得稍微复杂一些,因为即使视图中的填充没有显示任何内容,它也仍算作视图。

编辑:

我应该指出,皮埃尔说的是真的。如果您触摸视图,则即使您将手指拖到视图范围之外,它也将继续接收触摸事件,直到手指抬起。这意味着,ACTION_UP可以接收不在范围内的视图触摸坐标。



 类似资料:
  • 在Android手机上,我可以通过用户在其手机屏幕或设备上触摸获得坐标信息。那么,如何使用/传递这些X-Y坐标来运行我的特定函数,并在代码中使用它呢

  • 正如我在标题中指出的,我已经开始开发一个简单的应用程序,它包含在主框架窗口中,一个双缓冲面板。在这个面板中可以绘制一些图形,让我们把这个面板看作是一个简单的视窗,用来显示在里面绘制的元素。 这里添加了两个功能,平移和缩放可以缩放变换,并使用MouseDown和Move事件上更新的增量在paint事件内平移变换,OnMouseWheel用于更新缩放变换。 当缩放大于1(比例100%)时,尝试添加支持

  • 问题内容: 所以我一直在四处寻找屏幕上触摸的坐标。到目前为止,我可以通过以下方式获得一触的坐标: 但是当用两根手指触摸时,我只会得到第一次触摸的坐标。多点触控功能(我用这个小教程进行了测试:http : //www.techotopia.com/index.php/An_Example_Swift_iOS_8_Touch,_Multitouch_and_Tap_Application)。所以我的问

  • 问题内容: 我尝试从点击触摸屏的位置获取坐标,以在此时放置特定的UIImage。 我怎样才能做到这一点? 问题答案: 在子类中,例如: 这将返回一个视图坐标。 使用Swift 3语法更新 使用Swift 4语法更新

  • 标题说明了一切。我的问题是关于不同的字符串等价方法的效率。我经常使用<代码>。equalsIgnoreCase(String str),因为我对它很有兴趣。但我开始怀疑这是否是寻找字符串之间等价性的最有效方法。在我看来,正在调用一种大小写转换方法或,然后在其定义中调用,但我可能错了。那么,以下哪种方法在以下情况或任何情况下更有效?

  • 我的代码: 打印: 我的问题是:当我得到btn1的坐标时,MinX和MinY是0,我能理解。但对于btn2,MinY不应为0;MaxX和MaxY也不应该是0。那么,如何在VBox中获取按钮左角的真实坐标呢。为了清楚起见,我需要节点相对于VBox的坐标。谢谢