Android中使用GestureDetector的onScroll时如何获取精确绝对X坐标?
实现方案
- 第一步:提前获取屏幕宽度,计算屏幕中心点X坐标,避免在onScroll中重复计算影响性能
- 第二步:在onScroll回调中通过
e2.getRawX()获取当前触摸点相对于整个屏幕的绝对X坐标 - 第三步:用当前触摸X坐标减去屏幕中心X坐标,得到以屏幕中心为0点的目标数值,转整数即可符合你的坐标规则
完整代码实现
public class MyGestureListener implements GestureDetector.OnGestureListener{ // 屏幕宽度,通过构造方法传入 private final int screenWidth; public MyGestureListener(int screenWidth) { this.screenWidth = screenWidth; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){ // 计算屏幕中心X坐标 float centerX = screenWidth / 2f; // 获取当前触摸点的屏幕绝对X坐标 float currentTouchX = e2.getRawX(); // 计算目标坐标:中心为0,左负右正,取整得到连续整数 int targetCoordinate = Math.round(currentTouchX - centerX); // 这里直接使用targetCoordinate即可,符合你的坐标规则 // 比如1080宽度的屏幕:最左侧坐标为-540,最右侧为540,中心为0 return true; // 根据你的业务需求调整返回值 } // 其他需要实现的OnGestureListener方法,按需实现即可 @Override public boolean onDown(MotionEvent e) { return true; } @Override public void onShowPress(MotionEvent e) {} @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public void onLongPress(MotionEvent e) {} @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } }
补充说明
- 如果你的坐标规则是基于自定义View内部中心,而非整个屏幕中心,只需做两处修改:将传入的screenWidth替换为自定义View的宽度,将
e2.getRawX()替换为e2.getX()即可,得到的就是以View中心为0点的坐标值 - 如果需要保留浮点精度的坐标,不调用
Math.round()方法直接使用currentTouchX - centerX的结果即可
内容的提问来源于stack exchange,提问作者Akkuu
相关产品推荐
相关产品推荐

