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

先看效果

自定义TextView支持字符串中指定字体的颜色 大小 样式_第1张图片
图像 4.png

自定义属性简介

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

傻瓜式使用方法

xml






Java代码中使用方法

参数1:要展示的字符串;参数2:指定要设置属性的字符;参数3:设置的相关参数(字体/颜色/属性)
((ColorFontTextView)findViewById(R.id.tv)).setTextStyle("Often hate  not 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 ColorFontTextView  setTextStyle(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

    
    
    
    
    


以上为全部代码

你可能感兴趣的:(自定义TextView支持字符串中指定字体的颜色 大小 样式)