android 重写TextView 实现文字整齐排版

此生再无相见时 提交于 2020-03-01 10:13:50

 

//XRTextView类

package rong.android.test;

import org.json.JSONArray;
import org.json.JSONException;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;

public class XRTextView extends TextView{
 private final String namespace = "rong.android.TextView";
 private String text;
 private float textSize;
 private float paddingLeft;
 private float paddingRight;
 private float marginLeft;
 private float marginRight;
 private int textColor;
 private JSONArray colorIndex;
 private Paint paint1 = new Paint();
 private Paint paintColor = new Paint();
 private float textShowWidth;
 private float Spacing = 0;
 private float LineSpacing = 1.3f;//行与行的间距
 
 public XRTextView(Context context, AttributeSet attrs) {
  super(context, attrs);
  text = attrs.getAttributeValue(
    "http://schemas.android.com/apk/res/android", "text");
  textSize = attrs.getAttributeIntValue(namespace, "textSize", 25);//字体大小
  textColor = attrs.getAttributeIntValue(namespace, "textColor",Color.BLUE);//字体颜色
  paddingLeft = attrs.getAttributeIntValue(namespace, "paddingLeft", 0);
  paddingRight = attrs.getAttributeIntValue(namespace, "paddingRight", 0);
  marginLeft = attrs.getAttributeIntValue(namespace, "marginLeft", 0);
  marginRight = attrs.getAttributeIntValue(namespace, "marginRight", 0);
  paint1.setTextSize(textSize);
  paint1.setColor(textColor);
  paint1.setAntiAlias(true);
  paintColor.setAntiAlias(true);
  paintColor.setTextSize(textSize);
  paintColor.setColor(Color.BLUE);
 }
 public XRTextView(Context context, float textSize, int textColor, float paddingLeft, float paddingRight, float marginLeft, float marginRight){
  super(context);
  this.textSize = textSize;
  this.textColor = textColor;
  this.paddingLeft = paddingLeft;
  this.paddingRight = paddingRight;
  this.marginLeft = marginLeft;
  this.marginRight = marginRight;
  paint1.setTextSize(textSize);
  paint1.setColor(textColor);
  paint1.setAntiAlias(true);
  paintColor.setAntiAlias(true);
  paintColor.setTextSize(textSize);
  paintColor.setColor(Color.BLUE);
 }

 
 public JSONArray getColorIndex() {
  return colorIndex;
 }

 public void setColorIndex(JSONArray colorIndex) {
  this.colorIndex = colorIndex;
 }
 /**
  * 传入一个索引,判断当前字是否被高亮
  * @param index
  * @return
  * @throws JSONException
  */
 public boolean isColor(int index) throws JSONException{
  if(colorIndex == null){
   return false;
  }
  for(int i = 0 ; i < colorIndex.length() ; i ++){
   JSONArray array = colorIndex.getJSONArray(i);
   int start = array.getInt(0);
   int end = array.getInt(1)-1;
   if(index >= start && index <= end){
    return true;
   }
   
  }
  
  
  return false;
 }
 

 @Override
 protected void onDraw(Canvas canvas) {
//  super.onDraw(canvas);
  View view=(View)this.getParent();
  textShowWidth=view.getMeasuredWidth()-paddingLeft - paddingRight - marginLeft - marginRight;
  int lineCount = 0;
  
  text = this.getText().toString();//.replaceAll("\n", "\r\n");
  if(text==null)return;
  char[] textCharArray = text.toCharArray();
  // 已绘的宽度
  float drawedWidth = 0;
  float charWidth;
  for (int i = 0; i < textCharArray.length; i++) {
   charWidth = paint1.measureText(textCharArray, i, 1);
   
   if(textCharArray[i]=='\n'){
    lineCount++;
    drawedWidth = 0;
    continue;
   }
   if (textShowWidth - drawedWidth < charWidth) {
    lineCount++;
    drawedWidth = 0;
   }
   boolean color = false;
   try {
    color = isColor(i);
   } catch (JSONException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
   
   if(color){
    
    canvas.drawText(textCharArray, i, 1, paddingLeft + drawedWidth,
      (lineCount + 1) * textSize * LineSpacing, paintColor);
   }else{
    
    canvas.drawText(textCharArray, i, 1, paddingLeft + drawedWidth,
      (lineCount + 1) * textSize * LineSpacing, paint1);
   }
   if(textCharArray[i] > 127 && textCharArray[i] != '、' && textCharArray[i] != ',' && textCharArray[i] != '。' && textCharArray[i] != ':' && textCharArray[i] != '!'){
    drawedWidth += charWidth + Spacing;
    
   }else{
    drawedWidth += charWidth;

   }
  }
  setHeight((int) ((lineCount + 1) * (int) textSize * LineSpacing + 10));
 }
 public float getSpacing() {
  return Spacing;
 }
 public void setSpacing(float spacing) {
  Spacing = spacing;
 }
 public float getMYLineSpacing() {
  return LineSpacing;
 }
 public void setMYLineSpacing(float lineSpacing) {
  LineSpacing = lineSpacing;
 }
 public float getMYTextSize() {
  return textSize;
 }
 public void setMYTextSize(float textSize) {
  this.textSize = textSize;
  paint1.setTextSize(textSize);
  paintColor.setTextSize(textSize);
 }
 
 
}

 

 

//MainActivity类

package rong.android.test;

import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {
 private XRTextView xrtextview = null;
 private TextView textview = null;
 private String content = "abcdefgABCDEF我要你lfwjkdfl;skjf asljkflskjfls;kjfsljfwfisdlfjsllkjsdfjlskjf546132s1f3sd4f31s3dffslfksjdfljlsadkjflsajdf sdfjklsajdflsa;jdfls 的!@#$%^&*()_";

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  xrtextview = (XRTextView) this.findViewById(R.id.mytextview_tv);
  xrtextview.setText(content);
  textview = (TextView) this.findViewById(R.id.mytextview_tv1);
  textview.setText(content);
 }

}

//布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <rong.android.test.XRTextView
        android:id="@+id/mytextview_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/mytextview_tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black" />

</LinearLayout>

 

 

 

//源码可以去我的百度网盘下载

 

http://t.cn/zjSVQ0Z

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!