【问题标题】:Swipe gesture not recognized无法识别滑动手势
【发布时间】:2014-12-05 00:17:57
【问题描述】:

对于我的Buttons onClickListener 我有以下代码:

on_enter_button.setOnClickListener(
        new View.OnClickListener()
        {
            public void onClick(View view)
            {
                enter(words, linearLayout, llp, view);
             }
        });

我不想按回车Button,我只想在屏幕上任意方向Swipe并运行相同的方法:enter(words, linearLayout, llp, view);

目前我认为我的程序根本无法识别Swipe 手势。我认为这是因为我错误地放置了enter(words, linearLayout, llp, view);。另外,我将所有Gesture 识别码放在onCreate() 中。这是编写代码的正确方法吗?

有人可以帮忙吗?

编辑代码:

public class Game extends Activity{

public void enter(String[] w, LinearLayout ll, LinearLayout.LayoutParams params, View v){
... //some code
... //some code
... //some code
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return myGestureDetector.onTouchEvent(event);
    //error myGestureDetector not recognized since it's created in onCreate so it does not exist here
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.game_activity);

     SimpleOnGestureListener mySimpleGestureListener = new SimpleOnGestureListener()
     {

        @Override
        public boolean onDoubleTap(MotionEvent e) { 
            return super.onDoubleTap(e);
        }

        @Override
        //swipe does not work!
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) 
        {
                enter(words, linearLayout, llp, view);
                return super.onFling(e1, e2, velocityX, velocityY);
        }

        @Override
        public void onLongPress(MotionEvent e) {
            super.onLongPress(e);
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            return super.onSingleTapConfirmed(e);
        }

        private boolean permissibleYVelocity(float velocityY)
        {
            if ((velocityY < -200) || (velocityY > 200))
            {
                return false;
            }
            else
            {
                return true;
            }
        }   
    };

    final GestureDetector myGestureDetector = new  GestureDetector(getApplicationContext(), mySimpleGestureListener);

    //button listener works
    on_enter_button.setOnClickListener(
            new View.OnClickListener()
            {
                public void onClick(View view)
                {
                    enter(words, linearLayout, llp, view);
                 }
            });
    }

}

【问题讨论】:

    标签: java android swipe gesture


    【解决方案1】:

    您需要覆盖View.onTouchEvent()

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }
    

    在 SimpleOnGestureListener.onFling() 中调用你的方法:

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) 
    {
        enter(words, linearLayout, llp, view);
        return true;
    }
    

    编辑: 在 onCreate() 中设置您的 GestureDectector:

    mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener()
    {
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return super.onDoubleTap(e);
        }
    
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY)
        {
            enter(words, linearLayout, llp, view);
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    
        @Override
        public void onLongPress(MotionEvent e) {
            super.onLongPress(e);
        }
    
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            return super.onSingleTapConfirmed(e);
        }
    
        private boolean permissibleYVelocity(float velocityY)
        {
            if ((velocityY < -200) || (velocityY > 200))
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    });
    

    【讨论】:

    • 我是否在我的 SimpleOnGestureListener 类中覆盖这些?
    • 你可以在任何你想监听的视图中覆盖View.onTouchEvent(),在你的情况下是你的Activity类。 SimpleOnGestureListener.onFling()你已经拥有了,它只是没有做任何事情。
    • 对不起,我是新手。我在哪里调用 onFling()?在onTouch里面?还是我只是更改 SimpleGesture 中的 onFling()?
    • enter() 方法在 onFling() 中不起作用。尚未创建参数...我应该将手势覆盖方法放在 SimpleOnGesture 类中吗?在 onCreate 里面?或者只是在某处的活动中?我试图在网上找到可靠的教程,但一切都过时了......
    • 您需要像以前一样将 GestureDetector 设为字段变量。只需在 onCreate() 中进行初始化即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多