先看效果
自定义属性简介
颜色 :"#3bb64d"
字体大小(sp):"20"
字体下划线/删除线:"undeline/deleteline"
字体属性正常/加粗/倾斜/倾斜加粗:"normal/bold/italic/bold_italic”
傻瓜式使用方法
xml
<com.~~~~~~~.ColorFontTextView (单个颜色属性,null为不设置属性)
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#252c3d"
android:textSize="12sp"
app:text_arrays="人|何事|画"
app:style_arrays="bold|italic|bold_italic"
android:text="人生若只如初见,何事秋风悲画扇。" />
<com.~~~~~~~.ColorFontTextView (多个属性,null为不设置属性)
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#252c3d"
android:textSize="12sp"
app:text_arrays="人|何事|画"
app:style_arrays="bold|italic|bold_italic"
app:textsize_arrays="20|35|null"
app:color_arrays="#fa5645|#3bb64d|#bd0a0a"
app:line_arrays="undeline|null|deleteline"
android:text="人生若只如初见,何事秋风悲画扇。" />
<com.~~~~~~.ColorFontTextView (java代码中使用)
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#252c3d"
android:textSize="10sp" />
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<String> mTexts = new ArrayList<>();
private ArrayList<String> mColors = new ArrayList<>();
private ArrayList<String> mTextSizes = new ArrayList<>();
private ArrayList<String> mLines = new ArrayList<>();
private ArrayList<String> 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
<declare-styleable name="ColorFountTextView">
<attr name="text_arrays" format="string"/>
<attr name="color_arrays" format="string"/>
<attr name="textsize_arrays" format="string"/>
<attr name="line_arrays" format="string"/>
<attr name="style_arrays" format="string"/>
</declare-styleable>
以上为全部代码