2016-04-11 11 views
4

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( 'computeHorizo​​ntalScrollRange()' のことで戻ってきたの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つの列にページを分割する必要がありますか?

答えて

0

Css仕様では、要素の寸法を小数で表現することができますが、Webkitでは整数のみが必要とされるようです。
WebViewを以下の距離でスクロールすると、ページがきれいに表示されます。

if (areThereTwoColumns) { 
    view.loadUrl("javascript:(function(){mySheet.insertRule('html{ " + 
       "height: " + heightPage/density_ + "px;" + 
       " -webkit-column-width: "+ (widthPage - gap)/2/density_ + "px; " + 
       "-webkit-column-gap: " + gap/density_ + "px;" + 
       " font-size: " + textSize + ";}', ruleIndex)})()"); 
    // distance of scrolling: 
    scrollDistance = 2 * ((int)((widthPage - gap)/2/density_) * density_ + 
         (int)(gap/density_) * density_); 

} else { ...... } 


// myView.scrollTo((int)(scrollDistance * countPages), 0) etc 

私が見つかりました。解決策が最善であることをわからないんだけど、それは私のために動作します。 誰かが何か良いことを提案してくれたら大変感謝します。


それが唯一のSDK 16(tvdpi)に適しています:

areThereTwoColumns = areThereTwoColumns && getApplicationContext() 
     .getResources().getConfiguration() 
      .orientation == Configuration.ORIENTATION_LANDSCAPE; 
// ............omitted 
if (Build.VERSION.SDK_INT == 16 && getResources().getDisplayMetrics() 
           .densityDpi == DisplayMetrics.DENSITY_TV) 
    { 
     scrollDistance = 2 * ((int)((widthPage - gap)/2/density_ +.5f) * density_ + 
          (int)(gap/density_+.5f) * density_); 
    } 
// .............omitted 

、他のケースでは、一つでも列の場合には、あるため、表示されたページを何か他のものを使用する必要があります缶がゆがんでいる(tvdpi!) 例:

int countGates = Math.round((float)myView.computeHorizontalScrollRange()/(widthPage + ((areThereTwoColumns)?gap:0))); 
scrollDistance = (float) lengthMyView/countGates;