自定义TextView支持字符串中指定字体的颜色|自定义TextView支持字符串中指定字体的颜色 大小 样式

先看效果
自定义TextView支持字符串中指定字体的颜色|自定义TextView支持字符串中指定字体的颜色 大小 样式
文章图片
图像 4.png 自定义属性简介

颜色 :"#3bb64d" 字体大小(sp):"20" 字体下划线/删除线:"undeline/deleteline" 字体属性正常/加粗/倾斜/倾斜加粗:"normal/bold/italic/bold_italic”

傻瓜式使用方法
xml

Java代码中使用方法 参数1:要展示的字符串;参数2:指定要设置属性的字符;参数3:设置的相关参数(字体/颜色/属性)
((ColorFontTextView)findViewById(R.id.tv)).setTextStyle("Often hatenot as good as anyone","hate|not|anyone","20|null|35")(null为not不指定字体大小) .setTextStyle("#fa5645|#3bb64d|#bd0a0a")(设置颜色) .setTextStyle("bold|italic|bold_italic"); (设置属性)

单个字符串设置属性
((ColorFontTextView)findViewById(R.id.tv)).setTextStyle("hello world","hello world","#3bb64d") .setTextStyle("40") .setTextStyle("deleteline") .setTextStyle("undeline") .setTextStyle("bold_italic");

ColorFontTextView.java
public class ColorFontTextView extends AppCompatTextView { private ArrayList mTexts = new ArrayList<>(); private ArrayList mColors = new ArrayList<>(); private ArrayList mTextSizes = new ArrayList<>(); private ArrayList mLines = new ArrayList<>(); private ArrayList mStyles = new ArrayList<>(); private String mCurrentText; private Context mContext; private String styledTextString; private String styleTexts; public ColorFontTextView(Context context) { super(context); this.mContext = context; } public ColorFontTextView(ontext context, AttributeSet attrs) { super(context, attrs); this.mContext = context; init(attrs); } public ColorFontTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.mContext = context; init(attrs); } //获得我们所定义的自定义样式属性 private void init(AttributeSet attrs) { TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.ColorFountTextView); String colors =typedArray.getString(R.styleable.ColorFountTextView_color_arrays); String texts = typedArray.getString(R.styleable.ColorFountTextView_text_arrays); String textsizes = typedArray.getString(R.styleable.ColorFountTextView_textsize_arrays); String lines = typedArray.getString(R.styleable.ColorFountTextView_line_arrays); String styles = typedArray.getString(R.styleable.ColorFountTextView_style_arrays); typedArray.recycle(); initDate(getText().toString(), colors, texts, textsizes, lines, styles); setTextDate(); } //截取字符串添加到对应的集合 private void initDate(String str, String colors, String texts, String textsizes, String lines, String styles) { try { if (!TextUtils.isEmpty(texts)) { String[] split = texts.split("\\|"); for (int i = 0; i < split.length; i++) { mTexts.add(split[i]); } } if (!TextUtils.isEmpty(colors)) { String[] split = colors.split("\\|"); for (int i = 0; i < split.length; i++) { mColors.add(split[i]); } } if (!TextUtils.isEmpty(textsizes)) { String[] split = textsizes.split("\\|"); for (int i = 0; i < split.length; i++) { mTextSizes.add(split[i]); } } if (!TextUtils.isEmpty(lines)) { String[] split = lines.split("\\|"); for (int i = 0; i < split.length; i++) { mLines.add(split[i]); } } if (!TextUtils.isEmpty(styles)) { String[] split = styles.split("\\|"); for (int i = 0; i < split.length; i++) { mStyles.add(split[i]); } } mCurrentText = str; } catch (Exception e) { e.printStackTrace(); } } /*** 根据相关属性赋值*/ private void setTextDate() { try { if (!TextUtils.isEmpty(mCurrentText)) { SpannableString styledText = new SpannableString(mCurrentText); if (mTextSizes != null && mTextSizes.size() != 0) { int currentSize = mTextSizes.size() <=mTexts.size() ? mTextSizes.size() : mTexts.size(); for (int i = 0; i < currentSize; i++) { String size = mTexts.get(i); int startPostion = mCurrentText.indexOf(size); int endPostion = mCurrentText.indexOf(size) + size.length(); if (!mTextSizes.get(i).contains("null")) { styledText.setSpan(new AbsoluteSizeSpan(sp2px(mContext, Integer.valueOf(mTextSizes.get(i)))), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); }} } if (mColors != null && mColors.size() != 0) { int currentSize = mColors.size() <= mTexts.size() ? mColors.size():mTexts.size() ; for (int i = 0; i < currentSize; i++) { String size = mTexts.get(i); int startPostion = mCurrentText.indexOf(size); int endPostion = mCurrentText.indexOf(size) + size.length(); if (!mColors.get(i).contains("null")) { styledText.setSpan(new ForegroundColorSpan(Color.parseColor(mColors.get(i))), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); }} } if (mLines != null && mLines.size() != 0) { int currentSize = mLines.size() <= mTexts.size() ? mLines.size() : mTexts.size(); for (int i = 0; i < currentSize; i++) { String size = mTexts.get(i); int startPostion = mCurrentText.indexOf(size); int endPostion = mCurrentText.indexOf(size) + size.length(); if (!mLines.get(i).contains("null")) { if (mLines.get(i).contains("undeline")) { styledText.setSpan(new UnderlineSpan(), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else if (mLines.get(i).contains("deleteline")) { styledText.setSpan(new StrikethroughSpan(), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else { styledText.setSpan(new UnderlineSpan(), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } } } if (mStyles != null && mStyles.size() != 0) { int currentSize = mStyles.size()<=mTexts.size() ?mStyles.size(): mTexts.size(); for (int i = 0; i < currentSize; i++) { String size = mTexts.get(i); int startPostion = mCurrentText.indexOf(size); int endPostion = mCurrentText.indexOf(size) + size.length(); if (!mStyles.get(i).contains("null")) { StyleSpan styleSpan; if (("normal").equals(mStyles.get(i))) { styleSpan = new StyleSpan(Typeface.NORMAL); } else if (("bold").equals(mStyles.get(i))) { styleSpan = new StyleSpan(android.graphics.Typeface.BOLD); } else if (("italic").equals(mStyles.get(i))) { styleSpan = new StyleSpan(android.graphics.Typeface.ITALIC); } else if (("bold_italic").equals(mStyles.get(i))) { styleSpan = new StyleSpan(android.graphics.Typeface.BOLD_ITALIC); } else { styleSpan = new StyleSpan(Typeface.NORMAL); } styledText.setSpan(styleSpan, startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } } } setText(styledText); styledTextString=getText().toString(); } }catch (Exception e){ e.printStackTrace(); } }public ColorFontTextViewsetTextStyle(String str,String texts,String all){if(!TextUtils.isEmpty(all)&&!TextUtils.isEmpty(texts)){ styleTexts=texts; String[] split = all.split("\\|"); if(all.contains("#")){ initDate(str, all, texts,null, null, null); }else if(all.contains("undeline")||all.contains("deleteline")){ initDate(str,null,texts,null,all, null); }else if(all.contains("normal")||all.contains("bold")||all.contains("italic")||all.contains("bold_italic")){ initDate(str, null, texts, null, null, all); }else if(isNumeric(all)){ initDate(str, null, texts, all, null, null); }else{ initDate(str, null, texts, null, null, null); } setTextDate(); }else{ setText(str); } return this; } public ColorFontTextView setTextStyle(String all){ if(!TextUtils.isEmpty(styledTextString)&&!TextUtils.isEmpty(styleTexts)){ setTextStyle(styledTextString,styleTexts,all); } return this; }/*** 将sp值转换为px值,保证文字大小不变*/ public static int sp2px(Context context, int spValue) { float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); }/*** 判断字符串是是数字*/ public boolean isNumeric(String str){ Pattern pattern = Pattern.compile("[0-9]*"); Matcher isNum = pattern.matcher(str.replace("|","")); if( !isNum.matches() ){ return false; } return true; }}

attr.xml

以上为全部代码

    推荐阅读