Android TextView 設定字間距和行間距
阿新 • • 發佈:2019-02-16
1.如果您是要設定TextView的行間距 請使用(不用看2了)
android:lineSpacingMultiplier="1.8"
2.如果您是要設定字間距需要自定義控制元件<pre name="code" class="java">import android.content.Context; import android.graphics.*; import android.text.TextUtils; import android.util.AttributeSet; import android.widget.TextView; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by mrni-mac on 14-11-25. */ public class MyTextView extends TextView { private String content; private int width; private Paint paint; private int xPadding; private int yPadding; private int textHeight; private int xPaddingMin; int count; //記錄每個字的二維陣列 int[][] position; public MyTextView(Context context) { super(context); init(); } public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MyTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public void setText(String str) { width = this.getWidth(); getPositions(str); //重新畫控制元件 this.invalidate(); } public void init() { paint = new Paint(); paint.setColor(Color.parseColor("#888888")); paint.setTypeface(Typeface.DEFAULT); paint.setTextSize(dip2px(this.getContext(), 14f)); Paint.FontMetrics fm = paint.getFontMetrics();// 得到系統預設字型屬性 textHeight = (int) (Math.ceil(fm.descent - fm.top) + 2);// 獲得字型高度 //字間距 xPadding = dip2px(this.getContext(), 4f); //行間距 yPadding = dip2px(this.getContext(), 10f); //比較小的字間距(字母和數字應緊湊) xPaddingMin = dip2px(this.getContext(), 2f); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (!TextUtils.isEmpty(content)) { for (int i = 0; i < count; i++) { canvas.drawText(String.valueOf(content.charAt(i)), position[i][0],position[i][1], paint); } } } public void getPositions(String content) { this.content = content; char ch; //輸入點的 x的座標 int x = 0; //當前行數 int lineNum = 1; count = content.length(); //初始化字型位置陣列 position=new int[count][2]; for (int i = 0; i < count; i++) { ch =content.charAt(i); String str = String.valueOf(ch); //根據畫筆獲得每一個字元的顯示的rect 就是包圍框(獲得字元寬度) Rect rect = new Rect(); paint.getTextBounds(str, 0, 1, rect); int strwidth = rect.width(); //對有些標點做些處理 if (str.equals("《") || str.equals("(")) { strwidth += xPaddingMin * 2; } //當前行的寬度 float textWith = strwidth; //沒畫字前預判看是否會出界 x += textWith; //出界就換行 if (x > width) { lineNum++;// 真實的行數加一 x = 0; } else { //回到預判前的位置 x -= textWith; } //記錄每一個字的位置 position[i][0]=x; position[i][1]=textHeight * lineNum + yPadding * (lineNum - 1); //判斷是否是數字還是字母 (數字和字母應該緊湊點) //每次輸入完畢 進入下一個輸入位置準備就緒 if (isNumOrLetters(str)) { x += textWith + xPaddingMin; } else { x += textWith + xPadding; } } //根據所畫的內容設定控制元件的高度 this.setHeight((textHeight +yPadding) * lineNum); } //工具類:判斷是否是字母或者數字 public boolean isNumOrLetters(String str) { String regEx="^[A-Za-z0-9_]+$"; Pattern p=Pattern.compile(regEx); Matcher m=p.matcher(str); return m.matches(); } // 工具類:在程式碼中使用dp的方法(因為程式碼中直接用數字表示的是畫素) public static int dip2px(Context context, float dip) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dip * scale + 0.5f); } }
xml使用如下
<當前包名.MyTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/video_dec"
/>
效果如下