我在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。
viewX
如果您将填充包括在内,则它会变得稍微复杂一些,因为即使视图中的填充没有显示任何内容,它也仍算作视图。
编辑:
我应该指出,皮埃尔说的是真的。如果您触摸视图,则即使您将手指拖到视图范围之外,它也将继续接收触摸事件,直到手指抬起。这意味着,ACTION_UP可以接收不在范围内的视图触摸坐标。