当前位置: 代码迷 >> Android >> 关于Android的文字排版和换行有关问题,彻底解决
  详细解决方案

关于Android的文字排版和换行有关问题,彻底解决

热度:50   发布时间:2016-05-01 12:15:42.0
关于Android的文字排版和换行问题,彻底解决

package com.text.view;

import java.util.Arrays;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;

public class MyView extends View {
?private Paint mPaint = new Paint();

?public MyView(Context context) {
??this(context,null);
?}

?
?public MyView(Context context, AttributeSet attrs, int defStyle) {
??super(context, attrs, defStyle);
??init();
?}

?public MyView(Context context, AttributeSet attrs) {
??this(context,attrs,0);
?}

?private void init() {
??mPaint.setAntiAlias(true);
??mPaint.setColor(Color.BLACK);?
??mPaint.setStyle(Style.STROKE);
??mPaint.setTextSize(getRawSize(TypedValue.COMPLEX_UNIT_DIP, 12));
??
?}

[email protected]
?protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
??super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//??setMeasuredDimension(300, 200);
?}
?
[email protected]
?protected void onDraw(Canvas canvas) {
??super.onDraw(canvas);
??//canvas.drawColor(Color.WHITE);
??
??FontMetrics fm = mPaint.getFontMetrics();
??
??float baseline = fm.descent - fm.ascent;?
??float x = 0;
??float y =? baseline;

//注释掉的是当使用多段TextView时使用
??String txt1 = getResources().getString(com.middle.sport.R.string.more1);
??//String txt2 = getResources().getString(com.middle.sport.R.string.more2);
? //String txt3 = getResources().getString(com.middle.sport.R.string.more3);
??
??String[] text1s = autoSplit(txt1, mPaint, getWidth() - 15);
??//String[] text2s = autoSplit(txt2, mPaint, getWidth() - 15);
??//String[] text3s = autoSplit(txt3, mPaint, getWidth() - 15);
??
??System.out.printf("line indexs: %s\n", Arrays.toString(text1s));
??//System.out.printf("line indexs: %s\n", Arrays.toString(text2s));
??//System.out.printf("line indexs: %s\n", Arrays.toString(text3s));
??
??for(String text1 : text1s) {?
???canvas.drawText(text1, x, y, mPaint);?
???y += baseline + fm.leading;?
??}
?????/* y += 20;
??for(String text2 : text2s) {?
???canvas.drawText(text2, x, y, mPaint);?
???y += baseline + fm.leading;?
??}
????? y += 20;
??for(String text3 : text3s) {?
???canvas.drawText(text3, x, y, mPaint);?
???y += baseline + fm.leading;?
??}*/
?}
?private String[] autoSplit(String content, Paint p, float width) {
??int length = content.length();
??float textWidth = p.measureText(content);
??if(textWidth <= width) {
???return new String[]{content};
??}
??
??int start = 0, end = 1, i = 0;
??int lines = (int) Math.ceil(textWidth / width);?
??String[] lineTexts = new String[lines];
??while(start < length) {
???if(p.measureText(content, start, end) > width) {
????lineTexts[i++] = (String) content.subSequence(start, end);
????start = end;
???}
???if(end == length) {?
????lineTexts[i] = (String) content.subSequence(start, end);
????break;
???}
???end += 1;
??}
??return lineTexts;
?}
?public float getRawSize(int unit, float size) {
??????? Context c = getContext();
??????? Resources r;

??????? if (c == null)
??????????? r = Resources.getSystem();
??????? else
??????????? r = c.getResources();
????????
??????? return TypedValue.applyDimension(unit, size, r.getDisplayMetrics());
??? }
}

  相关解决方案