关于WebView的手势监听问题
大致内容是这样的,做了个手势监听的demo,但是加载的webview手势没有效果,之后在网上找到了解决方案,让MyWebView类继承WebView类,重写onTouchEvent方法,将其显式的传给ViewFlipper。手势监听能起作用了。但是又有问题了,比如我WebView载入的url是www.baidu.com 如此在百度显示首页的时候可以实现手势监听,但是再点进去一层,比如进入百度知道以后手势监听有没有响应了。WebView的onTouchEvent方法好像没有执行。下面是我的代码:
MyWebView.java
下面是SignFlipDemo.java
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.java
public 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;
}
}
...全文
相关推荐
继续拖动进入WebView图文详情
通常,WebView会被设置为不可见或高度为0,以便在需要时才展示。2. **监听手势**:我们需要监听用户的滑动手势。
webview刷新2
**监听滑动手势**:使用GestureDetector或者NestedScrollView等组件监听用户的滑动操作。2.
下拉刷新webview
**WebView的配置**: - 初始化WebView,加载指定的URL或者本地HTML资源。 - 配置WebView的设置,如开启JavaScript支持,调整缩放级别,禁用内置的缩放手势等。
android webView下拉刷新
这通常涉及使用滚动监听器(OnGestureListener)来检测滑动手势,然后根据手势改变头部视图的状态。6.
swift-实现类似微信的webView导航效果
在Swift编程中,创建一个类似微信的webView导航效果涉及到多个技术点,主要涵盖UIWebView或WKWebView的使用、自定义导航控制器以及手势识别。


