大致内容是这样的,做了个手势监听的demo,但是加载的webview手势没有效果,之后在网上找到了解决方案,让MyWebView类继承WebView类,重写onTouchEvent方法,将其显式的传给ViewFlipper。手势监听能起作用了。但是又有问题了,比如我WebView载入的url是www.baidu.com 如此在百度显示首页的时候可以实现手势监听,但是再点进去一层,比如进入百度知道以后手势监听有没有响应了。WebView的onTouchEvent方法好像没有执行。下面是我的代码:
MyWebView.java
public class MyWebView extends WebView { float downXValue;
long downTime;
private ViewFlipper flipper; private float lastTouchX, lastTouchY;
private boolean hasMoved = false;
private Activity context;

public MyWebView(Context context, ViewFlipper flipper) {
super(context);
this.context = (Activity) context;
this.flipper = flipper;
this.loadUrl("http://www.baidu.com");
} public boolean onTouchEvent(MotionEvent evt) { boolean consumed = super.onTouchEvent(evt);
if (isClickable()) {
switch (evt.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("lxy", "browser ---> down envent");
lastTouchX = evt.getX();
lastTouchY = evt.getY();
downXValue = evt.getX();
downTime = evt.getEventTime();
hasMoved = false;
break;
case MotionEvent.ACTION_MOVE:
hasMoved = moved(evt);
break;
case MotionEvent.ACTION_UP:
float currentX = evt.getX();
long currentTime = evt.getEventTime();
float difference = Math.abs(downXValue - currentX);
long time = currentTime - downTime; Log.i("Touch Event:", "Distance: " + difference + "px Time: "
+ time + "ms");
/** X轴滑动距离大于100,并且时间小于220ms,并且向X轴右方向滑动 && (time < 220) */
if ((downXValue < currentX)
&& (difference > 100 && (time < 220))) {
/** 跳到上一页 */
this.flipper.setInAnimation(AnimationUtils.loadAnimation(
this.getContext(), R.layout.right_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(
this.getContext(), R.layout.right_out)); flipper.showPrevious();
Log.d("lxy", "getDisplayedChild() = " + flipper.getDisplayedChild());

context.setTitle(Constant.TITLE_STR[flipper.getDisplayedChild()]);
}
/** X轴滑动距离大于100,并且时间小于220ms,并且向X轴左方向滑动 */
if ((downXValue > currentX) && (difference > 100)
&& (time < 220)) {
/** 跳到下一页 */
this.flipper.setInAnimation(AnimationUtils.loadAnimation(
this.getContext(), R.layout.left_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(
this.getContext(), R.layout.left_out));
flipper.showNext();
Log.d("lxy", "getDisplayedChild() = " + flipper.getDisplayedChild());
context.setTitle(Constant.TITLE_STR[flipper.getDisplayedChild()]);
} break;
}
}
return consumed || isClickable();
} private boolean moved(MotionEvent evt) {
return hasMoved || Math.abs(evt.getX() - lastTouchX) > 10.0
|| Math.abs(evt.getY() - lastTouchY) > 10.0;
}}下面是SignFlipDemo.javapublic class SignFlipDemo extends Activity implements OnGestureListener {

/** Called when the activity is first created. */
private static ViewFlipper flipper;
private GestureDetector detector; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
detector = new GestureDetector(this);//  分析用户动作
flipper = new ViewFlipper(this);
flipper.setBackgroundColor(Color.WHITE);
flipper.addView(addTextView("step 1", 0));//
flipper.addView(addTextView("step 2", 1));
flipper.addView(addTextView("step 3", 2));
setContentView(flipper);
setTitle(Constant.TITLE_STR[0]);
} private View addTextView(String text, int i) {
TextView tv = new TextView(this);
tv.setText(text);
tv.setGravity(1);
Drawable dabg;
switch (i) {
case 0:
dabg = this.getResources().getDrawable(R.drawable.videocolumn);
tv.setBackgroundDrawable(dabg);
return tv;

case 1:
dabg = this.getResources().getDrawable(R.drawable.playback);
tv.setBackgroundDrawable(dabg);
return tv;

case 2:
MyWebView webView = new MyWebView(this, flipper);
return webView;
}
return null;
} @Override
public boolean onTouchEvent(MotionEvent event) {
return this.detector.onTouchEvent(event);
} @Override
public boolean onDown(MotionEvent e) {
return false;
} @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() - e2.getX() > 60) {
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.layout.left_in));
flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.layout.left_out));
flipper.showNext();
Log.d("lxy", "getDisplayedChild() = " + flipper.getDisplayedChild());
this.setTitle(Constant.TITLE_STR[flipper.getDisplayedChild()]);
return true;
} else if (e1.getX() - e2.getX() < -60) {
flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.layout.right_in));
flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.layout.right_out));
flipper.showPrevious();
Log.d("lxy", "getDisplayedChild() = " + flipper.getDisplayedChild());
this.setTitle(Constant.TITLE_STR[flipper.getDisplayedChild()]);
return true;
}
return false;
} @Override
public void onLongPress(MotionEvent e) {
} @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
} @Override
public void onShowPress(MotionEvent e) {
} @Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
}