浏览器在各个平台都有,最容易拿到源码的就是Android的;虽然有现成的可用,还是自己分析一下;
Android的WebView.java是一个内置的支持浏览器的视图View,查看源码目录frameworks\base\core\java\android\webkit
下面有多个java源文件,第一个为WebView.java,这个类可不小,将近8000行;
WebView provides no browser-like widgets, does not enable JavaScript and web page errors are ignored. If your goal is only
to display some HTML as a part of your UI, this is probably fine
但是该WebView只支持展示Web Page,不支持JavaScript和页面内容;不过可以借鉴一下进行改造。
@Widget
public class WebView extends AbsoluteLayout
implements ViewTreeObserver.OnGlobalFocusChangeListener,
ViewGroup.OnHierarchyChangeListener {
WebView继承AbsoluteLayout,实现OnGlobalFocusChangeListener和OnHierarchyChangeListener
构造函数
protected WebView(Context context, AttributeSet attrs, int defStyle,
Map<String, Object> javascriptInterfaces) {
super(context, attrs, defStyle);
init();//初始化
mCallbackProxy = new CallbackProxy(context, this);//回调
mViewManager = new ViewManager(this);//View manager
mWebViewCore = new WebViewCore(context, this, mCallbackProxy, javascriptInterfaces); //WebViewCore
mDatabase = WebViewDatabase.getInstance(context);//WebViewDataBase
mScroller = new OverScroller(context);
updateMultiTouchSupport(context);
}
看看如下几个方法
private void init() {
setWillNotDraw(false);
setFocusable(true);
setFocusableInTouchMode(true);
setClickable(true);
setLongClickable(true);
final ViewConfiguration configuration = ViewConfiguration.get(getContext());
int slop = configuration.getScaledTouchSlop();
mTouchSlopSquare = slop * slop;
mMinLockSnapReverseDistance = slop;
slop = configuration.getScaledDoubleTapSlop();
mDoubleTapSlopSquare = slop * slop;
final float density = getContext().getResources().getDisplayMetrics().density;
// use one line height, 16 based on our current default font, for how
// far we allow a touch be away from the edge of a link
mNavSlop = (int) (16 * density);
// density adjusted scale factors
DEFAULT_SCALE_PERCENT = (int) (100 * density);
mDefaultScale = density;
mActualScale = density;
mInvActualScale = 1 / density;
mTextWrapScale = density;
DEFAULT_MAX_ZOOM_SCALE = 4.0f * density;
DEFAULT_MIN_ZOOM_SCALE = 0.25f * density;
mMaxZoomScale = DEFAULT_MAX_ZOOM_SCALE;
mMinZoomScale = DEFAULT_MIN_ZOOM_SCALE;
mMaximumFling = configuration.getScaledMaximumFlingVelocity();
mOverscrollDistance = configuration.getScaledOverscrollDistance();
mOverflingDistance = configuration.getScaledOverflingDistance();
}
void updateMultiTouchSupport(Context context) {
WebSettings settings = getSettings();
final PackageManager pm = context.getPackageManager();
mSupportMultiTouch = pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH)
&& settings.supportZoom() && settings.getBuiltInZoomControls();
mAllowPanAndScale = pm.hasSystemFeature(
PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);
if (mSupportMultiTouch && (mScaleDetector == null)) {
mScaleDetector = new ScaleGestureDetector(context,
new ScaleDetectorListener());
} else if (!mSupportMultiTouch && (mScaleDetector != null)) {
mScaleDetector = null;
}
}
一个大方法,该PrivateHandler内部多达600多行代码
/**
* General handler to receive message coming from webkit thread
*/
class PrivateHandler extends Handler {
@Override
public void handleMessage(Message msg) {
还有一个DataSetObserver
private class SingleDataSetObserver extends DataSetObserver { </