原生textview並沒有相對應的文字兩端對齊的API。
首先看一下效果:
基本上就是這麼一個效果,下面直接貼出代碼:
public class JustifyTextView extends TextView {
private int mLineY = 0;//總行高
private int mViewWidth;//TextView的總寬度
private TextPaint paint;
public JustifyTextView(Context context) {
super(context);
init();
}
public JustifyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public JustifyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = getPaint();
paint.setColor(getCurrentTextColor());
paint.drawableState = getDrawableState();
}
@Override
protected void onDraw(Canvas canvas) {
mLineY = 0;
mViewWidth = getMeasuredWidth();//獲取textview的實際寬度
mLineY += getTextSize();
String text = getText().toString();
Layout layout = getLayout();
int lineCount = layout.getLineCount();
for (int i = 0; i < lineCount; i++) {//每行循環
int lineStart = layout.getLineStart(i);
int lineEnd = layout.getLineEnd(i);
String lineText = text.substring(lineStart, lineEnd);//獲取TextView每行中的內容
if (needScale(lineText)) {
for (int j = 0; j <lineText.length() ; j++) {
}
if (i == lineCount - 1 ) {//最後一行不需要重繪
canvas.drawText(lineText, 0, mLineY, paint);
} else {
float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, paint);
//i就是行數
drawScaleText(canvas, lineText, width,i);
}
} else {
canvas.drawText(lineText, 0, mLineY, paint);
}
mLineY += getLineHeight();//寫完一行以後,高度增加一行的高度
}
}
/**
* 重繪此行.
*
* @param canvas 畫布
* @param lineText 該行所有的文字
* @param lineWidth 該行每個文字的寬度的總和
*/
private void drawScaleText(Canvas canvas, String lineText, float lineWidth,int firstline) {
float x = 0;
if (isFirstLineOfParagraph(lineText)) {
String blanks = " ";
canvas.drawText(blanks, x, mLineY, paint);
float width = StaticLayout.getDesiredWidth(blanks, paint);
x += width;
lineText = lineText.substring(3);
}
//比如說一共有5個字,中間有4個間隔,
//那就用整個TextView的寬度 - 5個字的寬度,
//然後除以4,填補到這4個空隙中
float interval = (mViewWidth - lineWidth) / (lineText.length() - 1);
for (int i = 0; i < lineText.length(); i++) {
//等於第一行的且前六個字
if (i<=6 && firstline==0 ){
paint.setColor(Color.RED);
}else {
paint.setColor(getCurrentTextColor());
}
String character = String.valueOf(lineText.charAt(i));
float cw = StaticLayout.getDesiredWidth(character, paint);
canvas.drawText(character, x, mLineY, paint);
x += (cw + interval);
}
}
/**
* 判斷是不是段落的第一行.
* 一個漢字相當於一個字符,此處判斷是否爲第一行的依據是:
* 字符長度大於3且前兩個字符爲空格
*
* @param lineText 該行所有的文字
*/
private boolean isFirstLineOfParagraph(String lineText) {
return lineText.length() > 3 && lineText.charAt(0) == ' ' && lineText.charAt(1) == ' ';
}
/**
* 判斷需不需要縮放.
*
* @param lineText 該行所有的文字
* @return true 該行最後一個字符不是換行符 false 該行最後一個字符是換行符
*/
private boolean needScale(String lineText) {
if (lineText.length() == 0) {
return false;
} else {
return lineText.charAt(lineText.length() - 1) != '\n';
}
}
}
在xml中的使用:
<com.zdd.electronics.view.JustifTextView
android:layout_marginTop="15dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#d5d5d5"
android:text="@string/text_serviceintroduce9"
android:textSize="12sp"
android:layout_marginRight="15dp"
android:layout_marginLeft="15dp"
android:layout_marginBottom="15dp"
/>
至此就可以實現上面效果圖效果。
會不定時更新安卓相關知識,喜歡的給點一下關注!!