androidwebview適配屏幕
1. android webview默認屏幕為中像素密度怎麼修改
Android中Webview載入的頁面居中顯示為中等像素密度的方法如下:
第一種方法:
WebSettings settings = webView.getSettings();
settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
LayoutAlgorithm是一個枚舉用來控制頁面的布局,有三個類型:
1.NARROW_COLUMNS:可能的話使所有列的寬度不超過屏幕寬度
2.NORMAL:正常顯示不做任何渲染
3.SINGLE_COLUMN:把所有內容放大webview等寬的一列中
用SINGLE_COLUMN類型可以設置頁面居中顯示,頁面可以放大縮小
第二種方法:
//設置載入進來的頁面自適應手機屏幕
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
第一個方法設置webview推薦使用的窗口,設置為true。第二個方法是設置webview載入的頁面的模式,也設置為true。這方法可以讓你的頁面適應手機屏幕的解析度,完整的顯示在屏幕上,可以放大縮小。
第三種方法:(主要用於平板,針對特定屏幕代碼調整解析度)
java">DisplayMetricsmetrics=newDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
intmDensity=metrics.densityDpi;
if(mDensity==120){
settings.setDefaultZoom(ZoomDensity.CLOSE);
}elseif(mDensity==160){
settings.setDefaultZoom(ZoomDensity.MEDIUM);
}elseif(mDensity==240){
settings.setDefaultZoom(ZoomDensity.FAR);
}
Android中的webview其實是一個瀏覽器,對js進行解析以便於在智能機上面很好的顯示。
2. webview怎麼做適配html
webview適配html的方法是通過meta 標簽指定屏幕的解析度。
比如常用寫法如下:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
特殊說明:
這里表示 viewport 的寬度為匹配設備屏幕的寬度,且禁用縮放。涉及到兩個概念:
viewport 元素
devicePixelRatio:設備上物理像素和設備獨立像素(device-independent pixels (dips))的比例。
由於 iphone 手機和 android 4.0 以上的手機支持修改 viewport 的 width 來改變頁面的縮放情況,因此我們可以將 width 指定為頁面設計的寬度,如此一來,你的頁面正好充滿 viewport 並全屏顯示,而不會縮放。例如:
<meta name="viewport" content="width=640px, user-scalable=no">
但是對於 android 4.0 以下的手機,不支持設置 viewport 的 width,但是我們可以設置 Android 的另一參數target-densitydpi,從而達到相同的目的,計算 target-densitydpi 的公式如下:
target-densitydpi = UI-width / device-width * window.devicePixelRatio * 160;
//UI-width :WebApp布局寬度
//device-width :屏幕解析度寬度
最終的解決方法:
<meta name="viewport" content="target-densitydpi=device-dpi, width=640px, user-scalable=no">
$(function () {
var DEFAULT_WIDTH = 640, // 頁面的默認寬度
ua = navigator.userAgent.toLowerCase(), // 根據 user agent 的信息獲取瀏覽器信息
deviceWidth = window.screen.width, // 設備的寬度
devicePixelRatio = window.devicePixelRatio || 1, // 物理像素和設備獨立像素的比例,默認為1
targetDensitydpi;
// Android4.0以下手機不支持viewport的width,需要設置target-densitydpi
if (ua.indexOf("android") !== -1 && parseFloat(ua.slice(ua.indexOf("android")+8)) < 4) {
targetDensitydpi = DEFAULT_WIDTH / deviceWidth * devicePixelRatio * 160;
$('meta[name="viewport"]').attr('content', 'target-densitydpi=' + targetDensitydpi +
', width=device-width, user-scalable=no');
}
// TODO: 其他手機需要特殊處理的在下面
});
3. webview android怎樣適配手機屏幕
第一種: WebSetting settings = webView.getSettings(); settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); 把所有內容放在webview等寬的一列中。(可能會出現頁面中鏈接失效) 第二種: settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); 第三種: DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int mDensity = metrics.densityDpi; if (mDensity == 120) { settings.setDefaultZoom(ZoomDensity.CLOSE); }else if (mDensity == 160) { settings.setDefaultZoom(ZoomDensity.MEDIUM); }else if (mDensity == 240) { settings.setDefaultZoom(ZoomDensity.FAR); }
4. webview視頻寬度適配
通過設置完成。webview官網顯示可以通過設置webview的相關Setting完成頁面的適配。但是存在問題是,這種的適配可以達到WebView的寬度適應手機屏幕寬度。
5. Android中系統應用對WebView的適配
Android 4.4 開始修改了瀏覽器的內核導致從5.0 開始,如果App為系統應用或者Root用戶,將無法使用WebView進行載入網頁的操作
錯誤日誌如下:
java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes
針對錯誤修改方法:
1,替換WebView 如果只支持簡單的
2,可以嘗試分離把引用系統許可權的部分分離成獨立的app進行獨立維護
3, 如果是定製版系統可以修改FrameWork層,注釋掉相應的異常
public static void hookWebView() {
int sdkInt = Build.VERSION.SDK_INT;
try {
Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");
Field field = factoryClass.getDeclaredField("sProviderInstance");
field.setAccessible(true);
Object sProviderInstance = field.get(null);
if (sProviderInstance != null) {
Log.i("thi","sProviderInstance isn't null");
return;
}
Method getProviderClassMethod;
if (sdkInt > 22) {
getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");
} else if (sdkInt == 22) {
getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");
} else {
return;
}
getProviderClassMethod.setAccessible(true);
Class<?> providerClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);
Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");
Constructor<?> providerConstructor = providerClass.getConstructor(delegateClass);
if (providerConstructor != null) {
providerConstructor.setAccessible(true);
Constructor<?> declaredConstructor = delegateClass.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
sProviderInstance = providerConstructor.newInstance(declaredConstructor.newInstance());
field.set("sProviderInstance", sProviderInstance);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
6. 使用WKWebView自適應屏幕遇到的問題以及最後解決的方法
在網上找了很多方法我就不廢話了 先一一列舉出來
第一種方法:這種方法適配屏幕不是太好,雙擊才可以完全適配屏幕,有興趣的話可以自己試一下
第二種方法:
在初始化WKWebView的時候添加配置可以解決自適應的問題 ,但是在載入的內容寬度大於高度的時候就有些不準確了,寬度無法自適應屏幕的寬度,最後我也沒搞明白是因為什麼原因,最後就放棄了這個方法。
//自適應屏幕寬度js
在載入的過程中我使用KVO監聽載入的進度,從而獲取最後載入內容的高度。
根據WKWebView的狀態去判斷是否載入完成:
有可能需要用到進度條和title屬性
一定一定要記得移除KVO監聽
第三種方法 也是我最後使用的方法:
我的需求是讓圖片的大小跟著屏幕的變化而變化,就是動態的去適應屏幕;那麼文字的字體就是自己可以控制,可大可小。要想達到這樣的效果,在用loadHTMLString載入字元串之前對它進行處理
處理HTMLString的原理:
原理就是用一個for循環,拿到所有的圖片,對每個圖片都處理一次,讓圖片的寬為100%,就是按照屏幕寬度自適應;讓圖片的高atuo,自動適應。文字的字體大小,可以去改font-size:14px
7. 請問android TV 上面 我就跑app裡面就一個webView 電視屏幕解析度是1900*1020的
mWebView.getSettings().setJavaScriptEnabled(true);
//intmInitialScale自適應屏幕百分比針對整個屏幕
mWebView.setInitialScale(mInitialScale);
//整個布局以焦點為中心放大縮小
mWebView.getSettings().setBuiltInZoomControls(true);
mWebView.loadUrl(url);
8. webview網頁自適應屏幕大小怎麼解決
方法1,建立不同解析度的網頁 。
方法2,以800*600建立網頁,用表格限制寬度,在1024*768的時候就空出兩邊來了。
一般都用方法2,只要表格限定了就不會錯位了 。
方法3,用css控制字體。不要用圖層做網頁 。
用CSS好。
要是不會CSS的話到網上下載一個別人網頁的CSS文件,把裡面的網址換上自己的就可以了。