WebViewを使用して電子書籍を読むためのHTMLコンテンツをアプリケーションに表示しますが、それを開発するには次の問題がありました。
webviewがこのhtml文字列を読み込んだ後に、ebookを解析し、解析された内容をhtml文字列で終わらせます。 I「はmyView.scrollTo(MYVIEWの幅* countPages、0)」とコンテンツの水平方向の配置はスタイルを追加/ HTMLフォーマットを使用することによって達成されるが、Uday Sravan Kによって提案さによって水平方向にページを移動
WebView内の2つの列にHTMLコンテンツを配置する
myView.setVerticalScrollBarEnabled(false);
myView.setHorizontalScrollBarEnabled(false);
myView.getSettings().setDisplayZoomControls(false);
myView.getSettings().setJavaScriptEnabled(true);
if (Build.VERSION.SDK_INT >= 11) myView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
myView.loadDataWithBaseURL("file:///android_asset/Text/", ebookContent, "text/html", "UTF-8", null);
。彼に感謝:
myView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
final String varMySheet = "var mySheet = document.styleSheets[0];";
final String varCSSIndex = "var ruleIndex = mySheet.cssRules.length;";
final float widthPage = view.getMeasuredWidth();
final float heightPage = view.getMeasuredHeight();
final float density_ = getResources().getDisplayMetrics().density;
final float gap = (int) (widthPage * .012f) * 2;
view.loadUrl("javascript:" + varMySheet);
view.loadUrl("javascript:" + varCSSIndex);
if (areThereTwoColumns) {
view.loadUrl("javascript:(function(){mySheet.insertRule('html { height: " +
heightPage/density_ + "px; -webkit-column-count: 2; -webkit-column-gap: " +
gap/density_ + "px;" +
" font-size: " + textSize +
"; }', ruleIndex)})()");
} else {
view.loadUrl("javascript:(function(){mySheet.insertRule('html { height: " +
heightPage/density_ +
"px; -webkit-column-gap: 0px; -webkit-column-width: " +
widthPage/density_ + "px;" + " font-size: " + textSize +
"; }', ruleIndex)})()");
}
}
});
私はWebViewののサイズの幅('.getMeasuredWidth()')チャンクにvebview内のコンテンツを分割。 htmlコンテンツが1つの列に配置されている場合は、エミュレータのページの向きがわかります。ただし、htmlを2列に配置すると、結果のページの幅がWebViewの幅とわずかに異なる場合があります。これは、デバイスの密度が整数でない場合に発生します。一部の変位は側面の一方からのアーチファクトとして示さなるが二つの列場合にページを反転
ビットによってこの異なる累算「myWebView.scrollTo(myWebView +ギャップの(幅)* countPages、0)」ビットでありますページのこれは、表示ページの幅がWebViewの幅と一致しなくなったためです。隣接ページのエッジは表示されるべきではなく、表示された領域に入ります。長さが等しい360276px( 'computeHorizontalScrollRange()' のことで戻ってきたのWebViewウェブコンテンツの私のロードされた風景モードで :
私は例えば、ネクサス7は1280x800pxs、7インチ、tvdpi(Genymotionエミュレータを)持っている、取りますWebView)とレイアウトの表示幅は1238pxに等しくなります。
注:PX =(INT)(DP *密度+ .5f)
XMLレイアウト:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity" android:background="@color/colorBackgroundView" android:id="@+id/container"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_alignParentTop="true" android:layout_marginLeft="16dp" android:layout_marginTop="10dp" android:layout_marginRight="16dp"> <com.o....www.android.reader.MyWebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <com.o....www.android.reader.PageCountShow android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout>
、HTMLコンテンツが返さ'document.body.scrollWidth'は270630pxと同じです。密度は1.33である。 この向きのデバイスでは、すべてのページが正確に表示されますが、 'のWebviewの全長/ webviewのレイアウトの幅'は丸められていません。
2つの列に配置すると、表示がかなり悪くなります。 WebViewのWebコンテンツの長さは267453px、HTMLコンテンツの長さは200904px(保持される割合)、Webviewの幅は1238px、ギャップは28px(Webviewのスクロール距離は1266px)です。
この場合、隣のページの端が目に見えるようになります。この領域は、ページをめくるほど大きくなります。 bodyタグ 'zoom'プロパティのスタイルを追加してreload html-contentでHTMLコンテンツのサイズを変更しようとしましたが、予期しない結果が発生しました。所望のページサイズを再度得ることができない。htmlページをwebviewレイアウト内に正確に配置する方法はありますか?たぶん私は別の方法で2つの列にページを分割する必要がありますか?