2011年6月17日金曜日

[Android] 縦書きを実装したったー(といってもまだ1行)

青空文庫とかをみていておもったのですが、まー、横文字の小説は読みづらい。
というわけなので、さくっとつくってみました。
(といいながら、案外時間がかかってしまった)
「縦書き」の実装です。

こんな感じになります。
























ありがちな発想としては
1.縦長のテキストビューを1つ作る
2.1文字ごとに改行をいれる。
というものなんですが、そんなアホなことをしてしまっては日本語本来の味が失われるということで、
あえて別の実装をしてみました。

どういう実装なのかというのを書きます。

1.文字数を取得
2.画面を半分に割る
3.縦幅を文字数で割る

こうするとわりと均等な感じで文字が配置できます。
文字がふえてくるとまた実装もかわってくるのですが、
今回は固定文字サイズと固定行数(1行)で行きたいとおもいます。

さ、まずは

0.ステータスバーとタイトルバーを消しさる。
・・・いきなり0番。

// タイトルバーの削除  
requestWindowFeature(Window.FEATURE_NO_TITLE);  
        
// ステータスバー削除  
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

0.1.画面を用意する
前準備多いですな。
今回はViewを手作りします。

class CharDrawView extends View {
  
 public CharDrawView(Context context) {
  super(context);
  setFocusable(true);
  this.context = context;
   
 }
}

コンストラクタあたりまでかいてみた。

さて、次はonDrawの実装です。
protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);

 // 1.文字数を取得する
 int length = mMessage.length();
         
 // 2.画面を縦に割る
 int height = canvas.getHeight() - 40;
 int width = canvas.getWidth() / 2 - 20;
 
 // 背景色
 canvas.drawColor(Color.WHITE);
         
 // 文字色
 Paint paint = new Paint();
 paint.setAntiAlias(true);
 
 paint.setColor(Color.BLUE);
 paint.setTextSize(40);
 
 // 描画領域外(ここからスタート)
 int oneHeight = 40; 
         
 // 3.1文字の高さを取得する
 int charSize = charHeight(length,height);
         
 for(int i= 0;i < length;i++) {
  String oneChar = getOneMessage(i);
          
     canvas.drawText(oneChar, width, oneHeight + oneCharHeight(charSize,40), paint);
          
     // 一文字の高さを足す
         oneHeight += charSize;

     }
         
         
}
  
/*
 * 1文字の高さ(余白なし)
 */
public int charHeight(int length,int height) {
 return height / length;
}

/*
 * 中心点から描く
 */
public int oneCharHeight(int one,int charSize) {
 return (one / 2) + (charSize /2);
}
  
/*
 * 1文字取得
 */
public String getOneMessage(int index) {
 return String.valueOf(mMessage.charAt(index));
}

まとめちゃった。 だいたいこんな感じで。 最後にViewをはめこんで終了です。
View drawView = new CharDrawView(this);
setContentView(drawView);

えっと、なんでこういう実装にしたかというと、
本来日本語(漢字のほうがただしいかな?)って縦書き文化なんですよ。
升目に分けて整列して書くものなので、
Viewを四画にわって配置していくのが適切じゃないかな、と。

もちろん、文字数が増えたり、行数が増えたらまたかわってくるのですが、
それはまたの機会にでも。

0 件のコメント:

コメントを投稿