fchiba memo

2010年07月

[ガジェット]たった600円でオライリー本をiPadやKindleで読む。すてき。- このブログは証明できない。

を真似してkindle用ファイルを作ってみたら、少しはまったのでメモ。

購入したのは Programming PHP(エクステンションの作り方が知りたかった)。

まず、
> Payloadというフォルダの中にappファイルがあります。
は、Windowsだと "(アプリ名).app" フォルダだった。

また、kindelgen を実行すると、
Error(prcgen): TOC section scope is not included in the parent chapter:BCMath Arbitrary Precision Mathematics ("BCMath~"というのは書籍内に含まれる章の名前)
というエラーが発生した。

エラーメッセージでググッたところ
http://www.mobipocket.com/forum/viewtopic.php?p=49267&sid=494a2df12b48a1e8fdca8ae0e7bfb752
がヒット。どうも、「toc.ncx」と「content.opfのspine要素」の整合性が取れていないためらしい。

toc.ncxの該当部分は
        <navPoint id="id2424422" playOrder="1004">
<navLabel>
<text>B.1. Optional Extensions Listing</text>
</navLabel>
<content src="apb.html#progphp2-APP-B-SECT-1"/>
<navPoint id="id2424885" playOrder="1005">
<navLabel>
<text>BCMath Arbitrary Precision Mathematics</text>
</navLabel>
<content src="re514.html"/>
</navPoint>

となっているが、id2424422とid2424885の両方ともspineに含まれていない。
(id2424422はアンカー指定となっているためかmanifest要素にさえ含まれていない。apb.html自体はさらに親のid2424369として含まれている)

試行錯誤の結果わかったのは、navPointに含まれるidは親も子もspineの中に記述されていないと駄目らしいということ。

・content.opf の spine にid2424885(子)を追加。
・toc.ncxのid2424422(親)のIDをid2424369(apb.htmlのID)に書き換え。

でコンパイルを通りmobiファイルが生成された。
kindle for PCで動作を確認したところ、本文は正しく表示された。ただ、目次のほうはkindle for PC に機能自体がないのでうまく動いているかどうか不明。

余談:epubファイルを作成するとき、本来はmimetypeを一番初めに無圧縮で格納しないといけないのだが、そこは適当でもkindlegenは大丈夫だった。

# http://fchiba.blog114.fc2.com/blog-entry-35.html をもう少しわかりやすく書きなおした。
# レイアウト計算の詳細を知らなくても読めるようになったはず。


ImageViewの表示サイズは、以下の要素によって決まります。

1. layout_width / layout_heightのパラメータ
2. Drawableの画像サイズ(IntrinsicWidth/Height)
3. minWidth / minHeight
4. maxWidth / maxHeight
5. BackgroundDrawable の画像サイズ(IntrinsicWidth/Height)
6. adjustViewBounds
7. padding
8. matrix
9. scaleType
10. cropToPadding

このうち、1.~7.によってImageViewの大きさが決まります。
8.~10.は、ImageViewの大きさが所与のものとして、その中でDrawableがどのように描画されるかを決めるパラメータです。

以下では話を簡単にするために、
・親ViewGroupがLinearLayoutで、orientaion=vertical, layout_width=fill_parent, layout_height=fill_parent
・ImageViewは、layout_width/layout_height に wrap_content か fill_parent のどちらかを指定(ピクセル指定しない)、padding=0
を仮定しています。


■View自体の大きさの決まり方

A. adjustViewBounds = true かつ layout_width/layout_height のどちらかにwrap_content が指定されている場合、
 A-1) width/heightをDrawableのIntrinsicWidth/Heightで仮ぎめ
 A-2) layout_width/layout_heightに、fill_parentが指定されていれば、親Viewの値で上書き
 A-3) layout_width/layout_heightに、wrap_contentが指定されていれば、親Viewより小さくなるようにする
    (ここで決めた値以上になることはない)
 A-4) layout_width が wrap_content の場合、layout_heightを固定のまま、Drawableのアスペクト比とおなじになるように layout_width を変更。
    (変更の結果 layout_width が元の値より大きくなってしまう場合はそのまま)
 A-5) A-4) で調整ができず layout_height が wrap_content の場合、
    layout_widthを固定のまま、Drawableのアスペクト比とおなじになるように layout_height を変更。
    (変更の結果 layout_height が元の値より大きくなってしまう場合はそのまま)

 注: A. の場合、minWidth / minHeight と BackgroundDrawableのIntrinsicWidth/Height は考慮されません。

B. A.以外の場合、
 B-1) fill_parent が指定されていれば、その値
 B-2) fill_parent が指定されていない場合、Drawableのwidth/heightを下記の順で調整する
    (i) minWidth / minHeight 以上
    (ii) BackgroundDrawableのIntrinsicWidth/Height 以上
    (iii) maxWidth / maxHeight 以下


■描画のされ方
scaleTypeの値によってDrawableが表示される位置と拡大率が決まります。

・fitXY
 ImageViewの大きさにぴったりあうように表示
・matrix
 setImageMatrixで指定したMatrixをそのまま使う
・center
 Drawableを中央に配置する。拡大率は1(オリジナル画像のまま)
・center_crop
 Drawableを、アスペクト比を維持しつつ隙間がなくなるように拡大・縮小して中央に配置するように描画
・center_inside
 Drawableを、アスペクト比を維持しつつ全てが収まるように拡大・縮小して中央に配置するように描画
・fitStart, fitEnd, fitCenter
 Matrix.ScaleToFit(http://developer.android.com/intl/ja/reference/android/graphics/Matrix.ScaleToFit.html)におまかせ

Drawableの描画がImageViewの大きさからはみ出す場合、cropToPaddingの値により、paddingの処理が変わります。
具体的には、CropToPaddingがfalse(デフォルト)の場合は、はみ出した箇所にはpaddingが表示されません(paddingの領域にもDrawableが描画される)が、
trueだと常にpaddingが表示されます。

このページのトップヘ