先看效果图:
l 注意事项:
1. 在布局文件中使用时,不要用android:text属性,而要用自定义属性app:text
2. 不支持一个只写一个汉字
3. 如果设置了app:suffixMode属性,则要在app:text值的后面加上后缀,如冒号(全角半角都可以)
l 在布局文件中的用法:
<com.alick.aligntextview.view.AlignTextView
style="@style/WW.tv_15_hei_33"
android:layout_width="75dp"
app:suffixMode="full_width"
app:text="优势:" />
attrs.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Textview两端对齐的自定义属性-->
<declare-styleable name="AlignTextView">
<!-- 文本-->
<attr name="text" format="string"/>
<!-- 后缀符号类型:全角、半角-->
<attr name="suffixMode" format="enum">
<enum name="full_width" value="1"/>
<enum name="half_width" value="2"/>
</attr>
</declare-styleable>
</resources>
AlignTextView.java文件
/** * 两端分散对齐的Textview * Created by cxw on 2015/12/28. */ public class AlignTextView extends TextView { private static final String TAG = "AlignTextView"; private static final int SUFFIXMODE_FULL_WIDTH = 1; private static final int SUFFIXMODE_HALF_WIDTH = 2; private Context context; /**文字*/ private String text; /**后缀符号全角或半角*/ private int suffixMode; /**后缀*/ private String suffixStr; public AlignTextView(Context context) { this(context, null); } public AlignTextView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public AlignTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context=context; TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.AlignTextView); text= typedArray.getString(R.styleable.AlignTextView_text); suffixMode= typedArray.getInt(R.styleable.AlignTextView_suffixMode,0); typedArray.recycle(); } @Override protected void onDraw(Canvas canvas) { Paint paint=new Paint(); paint.setAntiAlias(true); paint.setTextSize(getTextSize()); paint.setColor(getTextColors().getDefaultColor()); Rect targetRect = new Rect(0,0,getWidth(),getHeight()); Paint.FontMetricsInt fontMetrics = paint.getFontMetricsInt(); int baseline = (targetRect.bottom + targetRect.top - fontMetrics.bottom - fontMetrics.top) / 2; //下面这行是实现水平居中,drawText对应改为传入targetRect.centerX() //问题宽度 float textPx=getTextSize(); //Textview控件总宽度 int maxTextViewWidth=getWidth(); if(TextUtils.isEmpty(text)){ super.onDraw(canvas); return; } //情况一:无后缀 if(suffixMode==0){ char[] chars = text.toCharArray(); int spec= (int) ((maxTextViewWidth-chars.length*textPx)/(chars.length-1)); for (int i = 0; i < chars.length; i++) { canvas.drawText(String.valueOf(chars[i]), i * (textPx+spec), baseline, paint); } //情况二:有后缀 }else{ //后缀字符 suffixStr=text.substring(text.length() - 1, text.length()); //后缀宽度 int suffixWidth=getSuffixWidth(paint,suffixStr,suffixMode); char[] chars = text.substring(0,text.length() - 1).toCharArray(); int spec= (int) ((maxTextViewWidth-chars.length*textPx-suffixWidth)/(chars.length-1)); for (int i = 0; i < chars.length; i++) { canvas.drawText(String.valueOf(chars[i]), i * (textPx+spec), baseline, paint); } canvas.drawText(suffixStr,maxTextViewWidth-suffixWidth,baseline,paint); } super.onDraw(canvas); } /** * 计算后缀的宽度 * @param paint * @param suffixStr * @param suffixMode * @return */ private int getSuffixWidth(Paint paint,String suffixStr,int suffixMode){ if(TextUtils.isEmpty(suffixStr) || suffixMode==0){ return 0; } Rect rect=new Rect(); switch (suffixMode){ case SUFFIXMODE_FULL_WIDTH: paint.getTextBounds("啊",0,1,rect);//计算出一个全角字符的宽度 break; case SUFFIXMODE_HALF_WIDTH: paint.getTextBounds("a",0,1,rect);//计算出一个半角字符的宽度 break; } return rect.width(); } public void setAlingText(String text){ this.text=text; invalidate(); } }