重新计算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.
* <p>
*
* {@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;
}
}