CanvasのdrawText描画テキストを自動的に改行しない解決


原文住所:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0915/1682.html
CanvasのdrawTextを使ってテキストを描くと自動的に改行されず、長い文字列でもdrawTextは1行しか表示されず、超えた部分は画面の外に隠されています.各文字の幅を1つずつ計算し、一定のアルゴリズムで文字列を複数の部分に分割し、drawTextの一部の表示をそれぞれ呼び出すことができますが、この表示効率は低くなります.
StaticLayoutはandroidで文字の改行を処理するツールクラスで、StaticLayoutはテキストの改行を描画する処理を実現しています.次に、StaticLayoutを使用する方法の例を示します.
    package com.example.amdroidstaticlayoutdemo;
    import android.support.v4.app.Fragment;
    import android.text.Layout.Alignment;
    import android.text.StaticLayout;
    import android.text.TextPaint;
    import android.app.Activity;
    import android.content.Context;                     
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Paint.Style;
    import android.os.Bundle;
    import android.util.AttributeSet;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import android.os.Build;

    public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new MyView(this));
        }
        public class MyView extends View {  

            Paint mPaint; //  ,        、             
            public MyView(Context context) {  
                super(context);     
            }  

            public MyView(Context context, AttributeSet attrs){  
                super(context, attrs);  
            }  

            public void onDraw(Canvas canvas){  
                super.onDraw(canvas);  
                TextPaint tp = new TextPaint();
                tp.setColor(Color.BLUE);
                tp.setStyle(Style.FILL);
                tp.setTextSize(50);
                String message = "paint,draw paint     ,     、       , draw       、       ,          。           p";
                StaticLayout myStaticLayout = new StaticLayout(message, tp, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
                myStaticLayout.draw(canvas);
                canvas.restore();
            }  
        }  
    }
これはTextViewの効果と同じですが、実はTextViewもStaticLayoutを呼び出して改行を実現しています.
StaticLayoutのコンストラクション関数は3つあります.
public StaticLayout(CharSequence source,
                    TextPaint paint,
                    int width,
                    Layout.Alignment align,
                    float spacingmult,
                    float spacingadd,
                    boolean includepad)

public StaticLayout(CharSequence source,
                    int bufstart,
                    int bufend,
                    TextPaint paint,
                    int outerwidth,
                    Layout.Alignment align,
                    float spacingmult,
                    float spacingadd,
                    boolean includepad)

public StaticLayout(CharSequence source,
                    int bufstart,
                    int bufend,
                    TextPaint paint,
                    int outerwidth,
                    Layout.Alignment align,
                    float spacingmult,
                    float spacingadd,
                    boolean includepad,
                    TextUtils.TruncateAt ellipsize,
                    int ellipsizedWidth)
android StaticLayoutパラメータ解釈
StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth)
1.行が必要な文字列
2.支店が必要な文字列は、何番目の場所から始まるか
3.支店が必要な文字列はどこで終わるのか
4.ブラシオブジェクト
5.layoutの幅、文字列が幅を超えた場合に自動的に改行します.
6.layout的对其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITEの3種類.
7.相対行間隔、相対フォントサイズ、1.5 fは行間隔が1.5倍のフォント高さを表す.
8.ベースの行間にどれだけ追加するか
実際の行間隔は、この2つの和に等しい.
9.パラメータが不明
10.どこから省略するか
11.多少を超えて省略
このlayoutはデフォルトでCanvasの(0,0)点に描かれていますが、drawの前にCanvasの開始座標canvas.translate(x,y)を移動する必要がある場合は、位置を調整する必要があります.