ListView滚动和点击冲突

当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。
一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。
Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的。

要使用GestureDetector,有三步要走:

1. 创建OnGestureListener监听函数

2.创建GestureDetector实例

3.onTouch(View v, MotionEvent event)中拦截

    listener = new OnGestureListener() {

            public boolean onSingleTapUp(MotionEvent arg0) {
                // TODO Auto-generated method stub
                //一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件
                return false;
            }

            public void onShowPress(MotionEvent arg0) {
                // TODO Auto-generated method stub
               //如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行,具体这个瞬间是多久,我也不清楚呃……
            }

            public boolean onScroll(MotionEvent arg0, MotionEvent arg1,
                    float arg2, float arg3) {
                // TODO Auto-generated method stub
                //在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法
                return false;
            }

            public void onLongPress(MotionEvent arg0) {
                // TODO Auto-generated method stub
                 //长按触摸屏,超过一定时长,就会触发这个事件
            }

            public boolean onFling(MotionEvent e1, MotionEvent e2,
                    float velocityX, float velocityY) {
                // TODO Auto-generated method stub
//滑屏,用户按下触摸屏、快速移动后松开
                return true;
            }

            public boolean onDown(MotionEvent arg0) {
                // TODO Auto-generated method stub
                //用户按下屏幕就会触发;
                return false;
            }
        };

gestureDetector = new GestureDetector(CigaretteListActivity.this,
                listener);
        listView.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                gestureDetector.onTouchEvent(event);
                return false;
            }
        });
        listView.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub

                CigaretteUrl cigaretteUrl = (CigaretteUrl) parent
                        .getItemAtPosition(position);
                Intent intent = new Intent(ac, CigaretteDetailsActivity.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable("cigaretteUrl", cigaretteUrl);
                intent.putExtras(bundle);
                startActivity(intent);

            }
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值