You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:36:08