android - GestureDetector 实现界面左右滑动效果的优化

首先上效果图:


为了我表述方便,我将上图的显示区域进行标识,如下图:

上图中的左右箭头表示用户手势的方向和位置,当我们在View1的箭头位置进行手势时可以实现左右滑动的界面切换效果,但是在View2的箭头位置进行手势时无法被识别到,如果在View1中还有其它的控件,如按钮,也同样会出现这样的问题,为什么?怎么解决?

其实原因也很简单,大家也可以猜得到,就是,View2中的TextView控件将Touch消息处理了,或者说TextView控件没有响应左右滑动的手势。

在网上也有相关的资料和文章来说明上面的问题怎么解决,在这里给大家分享一下我的解决方法。

我们要在上图中实现左右滑动的界面切换效果,那么我们就要增加一下GestureDetector来检测用的手势,如下代码:

方法1:

GestureDetector gesture_detector = null;


gesture_detector = new GestureDetector(this,new MyGestureListener());

或者使用下面的代码:

方法2:

gesture_detector = new GestureDetector(this);

个人比较喜欢使用方法1,那么方法1就要实现MyGestureListener()的手势监听函数,代码如下:

    class MyGestureListener implements View.OnTouchListener,OnGestureListener 
    {        
        //@Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                
                //在这里,可以判断左右手势,或者增加自己的手势判断
                //同时,在这里增加相应的手势处理函数来完成相应的界面切换效果
		if(e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 50 )
		{
        	  //animShowNextPage();
		}
		else if(e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 50 )
		{
        	  //animShowPrePage();
		}  
        	return false;
        }

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

	//@Override
    	public void onLongPress(MotionEvent e)
    	{    		
    	}
    	
	//@Override
    	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
    			float distanceY)
    	{
    		return false;
    	}	

    	public void onShowPress(MotionEvent e)
    	{		
    	}

    	public boolean onSingleTapUp(MotionEvent e)
    	{
    		return false;
    	}

    	public boolean onTouch(View v, MotionEvent event)
    	{
           
             //这里面第一个参数v,就是用户单击的那个view,
             //在本例中就是那View2中的TextView
             //同时,你也可以使用这个参数来判定用户单击了哪一个View	
    		
            if(event.getAction() == MotionEvent.ACTION_DOWN)
            {  
		//如有需要,可以在这样增加相关的代码进行处理      
  	    }
            else if(event.getAction() == MotionEvent.ACTION_UP)
            {            	
            }       	
            
            gesture_detector.onTouchEvent(event);

    	    return false;
    	}    
    }    

代码中有相关的注释,这里不在多 说,需要说明一点的是,在该手势监听的类中多增加了onTouch的事件,这是因为在类的implements中增加了View.OnTouchListener,增加这个也是为了让TextView可以使用这个监听函数,同时其它的View也可以使用这个监听函数。

然后,在Activity中增加下面的代码:

    @Override
    public boolean onTouchEvent(MotionEvent me){
    	return gesture_detector.onTouchEvent(me);
    }  

此时,我们在View1的箭头位置进行手势时就可以实现左右滑动的界面切换效果了。

另外,还需要在onCreate的函数中为View2中的TextView增加事件监听函数,代码如下:

TextView txtview = (TextView)findViewById(R.id.content_view);
txtview.setText(getShowText());
txtview.setOnTouchListener(new MyGestureListener());  
如果在View1中还有其它的View的话,使用上面的方法为该View增加事件的监听函数即可。

如果你在上面使用方法2创建GestureDetector的话,那么你就可以使用下面的代码设置View的监听函数:

TextView txtview = (TextView)findViewById(R.id.content_view);
txtview.setOnTouchListener(this);  

到此,问题就已经解决了。

小结一下:出现该问题的原因是,没有为TextView增加手势监听的函数,解决方法就为View1区域中的每一个View都增加手势监听的函数即可。



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值