首先上效果图:
为了我表述方便,我将上图的显示区域进行标识,如下图:
上图中的左右箭头表示用户手势的方向和位置,当我们在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都增加手势监听的函数即可。