Webview内嵌在ScrollView中的底部空白和滑动冲突

重新计算Webview的内容高度,并设置到Webview

@JavascriptInterface
public void resize(final float height) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //Toast.makeText(getActivity(), height + "", Toast.LENGTH_LONG).show();
            //此处的 layoutParmas 需要根据父控件类型进行区分,这里为了简单就不这么做了
            webView.setLayoutParams(new FrameLayout.LayoutParams(getResources().getDisplayMetrics().widthPixels, (int) (height * getResources().getDisplayMetrics().density)));
        }
    });
}
 
  
主动调用:
 
  
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
	//获取html可见的高度,会有出错
        webView.loadUrl("javascript:App.resize(document.body.getBoundingClientRect().height)");
	//获取第一个快元素的高度,效率更好
	webView.loadUrl("javascript:App.resize(document.getElementsByTagName('div')[0].scrollHeight)");
super.onPageFinished(view , url) ; }}) ; webView.addJavascriptInterface( this, "App") ;
 
  
//别忘了设置webview支持javascript
 
  
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);

 
  
--------------------------------------------------屏蔽Scrollview内的滑动事件-----------------------------------------------
package com.xiaoyan.chat.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.widget.ScrollView;

import com.xiaoyan.chat.util.L;

public class TolerantScrollView extends ScrollView {

   private int mLastX;
   private int mLastY;
   
   private int distanceX;
   private int distanceY;
   
   private int mTouchSlop;
   
   public TolerantScrollView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      init();
   }

   public TolerantScrollView(Context context, AttributeSet attrs) {
      super(context, attrs);
      init();
   }

   public TolerantScrollView(Context context) {
      super(context);
      init();
   }
   
   private void init(){
      /**
       * define touch slop according to the display
       */
        final ViewConfiguration configuration = ViewConfiguration.get(getContext());
        mTouchSlop = configuration.getScaledTouchSlop();
   }
   /**
    * Processes every touch event through the {@link #onTouchEvent(MotionEvent)}
    * and intercepts if only we have restricted vertical scrolling.
    * 

* * {@inheritDoc} */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { onTouchEvent(ev); int dy = 0; int dx = 0; switch(ev.getAction()){ case MotionEvent.ACTION_DOWN: distanceX = 0; distanceY = 0; mLastX = (int) ev.getX(); mLastY = (int) ev.getY(); break; case MotionEvent.ACTION_MOVE: dx = Math.abs((int) (mLastX - ev.getX())); mLastX = (int) ev.getX(); distanceX += dx; dy = Math.abs((int) (mLastY - ev.getY())); mLastY = (int) ev.getY(); distanceY += dy; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: // define whether we have vertical scrolling // without horizontal one and intercept if so if (distanceY > mTouchSlop && distanceX < mTouchSlop){ L.e(VIEW_LOG_TAG, "intercepted"); return true; } distanceX = 0; distanceY = 0; break; } return false; } }



你可能感兴趣的:(Android高级,实战经验)