本文實(shí)例講述了Android重寫TextView實(shí)現(xiàn)文字整齊排版的方法。分享給大家供大家參考,具體如下:
XRTextView類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
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; } /** * 傳入一個(gè)索引,判斷當(dāng)前字是否被高亮 * @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類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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); } } |
布局文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
< 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 > |
完整實(shí)例代碼點(diǎn)擊此處本站下載。
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。