今回はスクロール機能を実装する予定だったが、予定を変えて少しソースコードの整理をすることにした。まずは定数クラスを作成した。これはViewInfoのキーで使われる文字列を定数にした
package text.edit.info; public class ConstName { public static final String EDITOR_FONT_SIZE = "Editor.FontSize"; public static final String EDITOR_WIDTH = "Editor.Width"; public static final String EDITOR_HEIGHT = "Editor.Height"; public static final String SCROLL_X = "Scroll.X"; public static final String SCROLL_Y = "Scroll.Y"; public static final String CARET_ROW = "Caret.Row"; public static final String CARET_COLUMN = "Caret.Column"; }
この変更に伴っていくつか変更箇所があるEditorViewのinitViewInfoとonDrawである。ただ文字列を定数に変えただけ
private void initViewInfo(){ viewInfo = new ViewInfo(); viewInfo.put(ConstName.EDITOR_FONT_SIZE, fontSize); viewInfo.put(ConstName.SCROLL_X, 0); viewInfo.put(ConstName.SCROLL_Y, 0); viewInfo.put(ConstName.CARET_ROW, 0); viewInfo.put(ConstName.CARET_COLUMN, 0); }
@Override protected void onDraw(Canvas canvas){ viewInfo.put(ConstName.EDITOR_WIDTH, getWidth()); viewInfo.put(ConstName.EDITOR_HEIGHT, getHeight()); TextPaint paint = new TextPaint(); rowRuler.drawRuler(canvas, viewInfo, paint); drawText(canvas, document.getText(), paint); }
あとはRowRulerを変更した。背景描画と行数描画を別のメソッドに分けた。ついでに行数を右揃えで描画するようにしてみた。あとは先程の定数の変更を行った
package text.edit.view; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Canvas; import android.text.TextPaint; import text.edit.info.ConstName; import text.edit.info.ViewInfo; public class RowRuler implements Ruler{ private static final int DEFAULT_PLACE = 5; private int place; public RowRuler(){ place = RowRuler.DEFAULT_PLACE; } public RowRuler(int place){ this.place = place; } public void drawRuler(Canvas canvas, ViewInfo viewInfo, TextPaint paint){ int fontSize = viewInfo.getInt(ConstName.EDITOR_FONT_SIZE); int width = (fontSize / 2) * 5; int height = (viewInfo.getInt(ConstName.EDITOR_HEIGHT)); int srcColor = paint.getColor(); Paint.Style srcStyle = paint.getStyle(); drawBackground(canvas, width, height, paint); drawLineNumber(canvas, width, height, viewInfo, paint); paint.setColor(srcColor); paint.setStyle(srcStyle); canvas.translate(width + 4, 0); } //背景描画 private void drawBackground(Canvas canvas, int width, int height, TextPaint paint){ int srcColor = paint.getColor(); Paint.Style srcStyle = paint.getStyle(); paint.setStyle(Paint.Style.FILL); paint.setColor(0xFFFFCC00); canvas.drawRect(0, 0, width, height, paint); //このメソッドが呼ばれる前のスタイルと色に戻す paint.setStyle(srcStyle); paint.setColor(srcColor); } //行数描画 private void drawLineNumber(Canvas canvas, int width, int height, ViewInfo viewInfo, TextPaint paint){ int srcColor = paint.getColor(); int fontSize = viewInfo.getInt(ConstName.EDITOR_FONT_SIZE); paint.setColor(Color.BLACK); int row = 0; for(int y = fontSize; y <= height; y += fontSize){ String rowNumber = String.format("%0" + place + "d", ++row); int x = alignRight(rowNumber, width, paint); canvas.drawText(rowNumber, x, y, paint); } //このメソッドが呼ばれる前の色に戻す paint.setColor(srcColor); } //渡された文字列が幅widthの領域の中で右揃えになるようなx座標を返す private int alignRight(String text, int width, TextPaint paint){ return width - (int)paint.measureText(text, 0, text.length()); } }