【问题标题】:Android - Trouble with swipe gestureAndroid - 滑动手势出现问题
【发布时间】:2012-04-04 09:04:25
【问题描述】:

我正在尝试在我的应用中实现滑动手势。我已经编写了几乎所有的代码,但它不起作用。

这是我的 Activity 中的代码:

// Swipe detector
gestureDetector = new GestureDetector(new SwipeGesture(this));
gestureListener = new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event)
    {
        Log.e("", "It works");
        return gestureDetector.onTouchEvent(event);
    }
};

LinearLayout root = (LinearLayout) findViewById(R.id.rules_root);
root.setOnTouchListener(gestureListener);

当我触摸屏幕时,logcat 显示it works

这是我的课程代码SwipeGesture

public class SwipeGesture extends SimpleOnGestureListener
{
    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

    private Activity activity;

    public SwipeGesture(Activity activity)
    {
        super();
        this.activity = activity;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
    {
        Log.e("", "Here I am");
        try
        {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false;
            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
            {
                if ( ((TabActivity) activity.getParent()).getTabHost() != null )
                {
                    TabHost th = ((TabActivity) activity.getParent()).getTabHost();
                    th.setCurrentTab(th.getCurrentTab() - 1);
                }
                else
                {
                    activity.finish();
                }
                Log.e("", "Swipe left");
            }
            else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
            {
                if ( ((TabActivity) activity.getParent()).getTabHost() != null )
                {
                    TabHost th = ((TabActivity) activity.getParent()).getTabHost();
                    th.setCurrentTab(th.getCurrentTab() + 1);
                }
                Log.e("", "Swipe right");
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return false;
    }
}

Log.e("", "Here I am"); 行永远不会显示。所以我认为永远不会调用 onFling 方法。

关于为什么这不起作用的任何想法?

谢谢。

问候。

V.

【问题讨论】:

    标签: android gesture swipe onfling


    【解决方案1】:

    在您的 SimpleOnGestureListener 中,覆盖 onDown 以注册您的手势。它可以只返回true,但必须像这样定义..

    @Override
        public boolean onDown(MotionEvent e) {
                return true;
        }
    

    ....See this link.. and the comment below the answer..

    【讨论】:

    • 哦,伙计,我用了差不多两个小时来解决同样的问题,+1 感谢您的客观性
    【解决方案2】:

    您需要更改一些内容,这是一个示例。

    设置您的 OnTouchListener

    root.setOnTouchListener(new View.OnTouchListener() {
                public boolean onTouch(View v, MotionEvent event) {
                    if (gestureDetector.onTouchEvent(event)) {
                        return false;
                    }
                    return false;
                }
            });
    

    SwipeGesture 类

    class SwipeGesture extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
    
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    //Do something
    
                    return true;
                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
    //Do something
                    return true;
    
                }
    
            } catch (Exception e) {
                Log.e("Fling", "There was an error processing the Fling event:"
                        + e.getMessage());
            }
            return true;
        }
    
        // Necessary for the onFling event to register
        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }
    }
    

    您似乎在Tabs 之间滑动。使用FragmentsViewPager 对您的用户来说更容易、更流畅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多