私は、電子書籍リーダーの種類の Android アプリケーションを開発しようとしています。使用可能な画面スペースに基づいて、長い html 文字列 (実行時にサーバーから送信される) をその場でページに分割する必要があります。HTML コンテンツは、テキスト、画像、ビデオなどを含む記事です。HTML を表示するために WebView を使用しています。
これを達成する方法を教えてください。
前もって感謝します。
私は、電子書籍リーダーの種類の Android アプリケーションを開発しようとしています。使用可能な画面スペースに基づいて、長い html 文字列 (実行時にサーバーから送信される) をその場でページに分割する必要があります。HTML コンテンツは、テキスト、画像、ビデオなどを含む記事です。HTML を表示するために WebView を使用しています。
これを達成する方法を教えてください。
前もって感謝します。
何らかの HTML/DOM 解析を行うと、壁を乗り越えることになると思います。これは、独自の HTML レイアウト エンジンの開発を効果的に開始していることを意味します。
CSS3 の列関数を使用することをお勧めします。基本的には、幅と高さが固定された列内にコンテンツをレンダリングします。これがあなたのページになります。次に、コンテンツの位置を左にシフトしてページ間を移動し、オーバーフロー要素を非表示にするコンテナーにラップします。
HTML は基本的に次のようになります。
<body>
<div id="container">
<div id="content">
CONTENT GOES HERE
<span id="endMarker"></span>
</div>
</div>
<div>
<button id="previous">Previous</button>
<span id="page">Page N of M</span>
<button id="next">Next</button>
</div>
</body>
基本的な CSS は次のとおりです。
#container {
width: 240px;
overflow: hidden;
background-color: yellow;
}
#content {
position: relative;
height: 30em;
-moz-column-width: 240px;
-webkit-column-width: 240px;
column-width: 240px;
-moz-column-gap: 10px;
-webkit-column-gap: 10px;
column-gap: 10px;
}
次に、#contentの CSS プロパティを設定してleft
、-250px の倍数でページを切り替えます。
コンテンツに必要な列数を計算するだけで、ページングができます。Javascript で css3 の複数列カウントを取得する方法は、ヒントを提供します#endMarker
。
Moby Dick の最初の章を含むhttp://lateral.co.za/pages.htmlの実例を次に示します。Chrome と Android では動作しますが、Firefox では動作しません。CSS 列の実装が異なるためだと思います。ここでは Android に関心があるので、コードは適切です。
重要な部分は次のとおりです。
<span id="endMarker"></span>
コンテンツの後 (ただし#content
div 内)の追加#previous
and#next
ボタンとスパンの追加は#page
、すべて の外側にあり#container
ます。jQuery がロードされた後のこの JavaScript:
var _column = 0;
var _columnCount = 0;
var _columnWidth = 240;
var _columnGap = 10;
$(function() {
_columnCount = Math.floor($('#endMarker').position().left/(_columnWidth + _columnGap));
setColumn = function(i) {
_column = i;
document.getElementById('content').style.left = -1 * _column * (_columnWidth + _columnGap);
$('#page').html('Page ' + (_column+1) + ' of ' + (_columnCount+1));
}
$('#next').click(function() {
if (_column==_columnCount) return;
setColumn(_column+1);
});
$('#previous').click(function() {
if (0==_column) return;
setColumn(_column-1);
});
setColumn(0);
});
それでおしまい。
仕事の余地があります。その列数の計算について考えたいと思うかもしれませんが、参照されている SO 投稿からそれを吸い取ったのですが、実際には考えていませんでした...コンテナの幅は、コンテンツの列幅に影響を与えるようです。私にはまったく意味がありません。
しかし、少なくとも Chrome と Android では、HTML の解析や独自のレイアウトを行うことなく、少なくともすべてが機能しているようです。
HTMLを解析する必要があります。JavaScriptのようにDOMにアクセスできるライブラリを使用するのが最善です。次に、解析されたコンテンツのカスタムレイアウトを作成できます。WebViewはJavaScriptをサポートしていますか?それは試してみるのに良いスタートです。
明らかに、HTMLファイルの任意の場所で分割することはできません。HTMLタグを考慮する必要があります。DOMを変更するか、HTMLを分割した後、コンテンツのカスタムCSSファイルを提供して、コンテンツを好きなように表示し、ライブラリまたはJavaScriptを使用してページ付けを追加できます。
を使用<span style="display:none"></span>
すると、Webサイトのコンテンツを非表示にするのに役立ちます。次に、物理的に分割する必要はありません(とにかくページをロードした後、メモリ内にあります)。
それが少し役に立ったことを願っています。ここでは完全な解決策は得られませんが、いくつかのアイデアが得られた可能性があります。さらに具体的な問題を見つけた場合は、より具体的な質問をする方が簡単です。