TextView有时不能满足我们排版的需求,那么如何重新定义TextView以实现我们的想法呢,以下是实现的代码:
- //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>
源码下载:百度盘