工具類之SpannableStringUtils(相信你會愛上它)
字數(shù)412閱讀709評論13喜歡33
這個工具類真是構思了良久才設計出來厅缺,采用了建造者模式,然后你們就可以用鏈式調(diào)用了符衔,talk is cheap, let me show the demo.
demo
code
有沒有心動一下哈奈辰,下面就讓老司機為你們開路峻呛。
站點
SpannableString相關工具類→SpannableStringUtils.java→Demo
getBuilder? ? ? ? : 獲取建造者setFlag? ? ? ? ? : 設置標識setForegroundColor: 設置前景色setBackgroundColor: 設置背景色setQuoteColor? ? : 設置引用線的顏色setLeadingMargin? : 設置縮進setBullet? ? ? ? : 設置列表標記setProportion? ? : 設置字體比例setXProportion? ? : 設置字體橫向比例setStrikethrough? : 設置刪除線setUnderline? ? ? : 設置下劃線setSuperscript? ? : 設置上標setSubscript? ? ? : 設置下標setBold? ? ? ? ? : 設置粗體setItalic? ? ? ? : 設置斜體setBoldItalic? ? : 設置粗斜體setFontFamily? ? : 設置字體setAlign? ? ? ? ? : 設置對齊setBitmap? ? ? ? : 設置圖片setDrawable? ? ? : 設置圖片setUri? ? ? ? ? ? : 設置圖片setResourceId? ? : 設置圖片setClickSpan? ? ? : 設置點擊事件setUrl? ? ? ? ? ? : 設置超鏈接setBlur? ? ? ? ? : 設置模糊append? ? ? ? ? ? : 追加樣式字符串create? ? ? ? ? ? : 創(chuàng)建樣式字符串
具體路線
packagecom.blankj.utilcode.utils;importandroid.graphics.Bitmap;importandroid.graphics.BlurMaskFilter;importandroid.graphics.Typeface;importandroid.graphics.drawable.Drawable;importandroid.net.Uri;importandroid.support.annotation.ColorInt;importandroid.support.annotation.DrawableRes;importandroid.support.annotation.NonNull;importandroid.support.annotation.Nullable;importandroid.text.Layout.Alignment;importandroid.text.SpannableStringBuilder;importandroid.text.Spanned;importandroid.text.style.AlignmentSpan;importandroid.text.style.BackgroundColorSpan;importandroid.text.style.BulletSpan;importandroid.text.style.ClickableSpan;importandroid.text.style.ForegroundColorSpan;importandroid.text.style.ImageSpan;importandroid.text.style.LeadingMarginSpan;importandroid.text.style.MaskFilterSpan;importandroid.text.style.QuoteSpan;importandroid.text.style.RelativeSizeSpan;importandroid.text.style.ScaleXSpan;importandroid.text.style.StrikethroughSpan;importandroid.text.style.StyleSpan;importandroid.text.style.SubscriptSpan;importandroid.text.style.SuperscriptSpan;importandroid.text.style.TypefaceSpan;importandroid.text.style.URLSpan;importandroid.text.style.UnderlineSpan;importstaticandroid.graphics.BlurMaskFilter.Blur;/**
*
*? ? author: Blankj
*? ? blog? : http://blankj.com
*? ? time? : 16/12/13
*? ? desc? : SpannableString相關工具類
*
*/publicclassSpannableStringUtils{privateSpannableStringUtils(){thrownewUnsupportedOperationException("u can't instantiate me...");? ? }/**? ? * 獲取建造者? ? *? ? *@return{@linkBuilder}? ? */publicstaticBuildergetBuilder(@NonNull CharSequence text){returnnewBuilder(text);? ? }publicstaticclassBuilder{privateintdefaultValue =0x12000000;privateCharSequence text;privateintflag;@ColorIntprivateintforegroundColor;@ColorIntprivateintbackgroundColor;@ColorIntprivateintquoteColor;privatebooleanisLeadingMargin;privateintfirst;privateintrest;privatebooleanisBullet;privateintgapWidth;privateintbulletColor;privatefloatproportion;privatefloatxProportion;privatebooleanisStrikethrough;privatebooleanisUnderline;privatebooleanisSuperscript;privatebooleanisSubscript;privatebooleanisBold;privatebooleanisItalic;privatebooleanisBoldItalic;privateString? ? fontFamily;privateAlignment align;privatebooleanimageIsBitmap;privateBitmap? bitmap;privatebooleanimageIsDrawable;privateDrawable drawable;privatebooleanimageIsUri;privateUri? ? ? uri;privatebooleanimageIsResourceId;@DrawableResprivateintresourceId;privateClickableSpan clickSpan;privateString? ? ? ? url;privatebooleanisBlur;privatefloatradius;privateBlur? ? style;privateSpannableStringBuilder mBuilder;privateBuilder(@NonNull CharSequence text){this.text = text;? ? ? ? ? ? flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;? ? ? ? ? ? foregroundColor = defaultValue;? ? ? ? ? ? backgroundColor = defaultValue;? ? ? ? ? ? quoteColor = defaultValue;? ? ? ? ? ? proportion = -1;? ? ? ? ? ? xProportion = -1;? ? ? ? ? ? mBuilder =newSpannableStringBuilder();? ? ? ? }/**? ? ? ? * 設置標識? ? ? ? *? ? ? ? *@paramflag
- ? ? ? ? *? ? ? ? ? ?
- {@linkSpanned#SPAN_INCLUSIVE_EXCLUSIVE} ? ? ? ? *? ? ? ? ? ?
- {@linkSpanned#SPAN_INCLUSIVE_INCLUSIVE} ? ? ? ? *? ? ? ? ? ?
- {@linkSpanned#SPAN_EXCLUSIVE_EXCLUSIVE} ? ? ? ? *? ? ? ? ? ?
- {@linkSpanned#SPAN_EXCLUSIVE_INCLUSIVE} ? ? ? ? *? ? ? ? ? ?
- ? ? ? ? *? ? ? ? ? ? ? ? ?
- monospace ? ? ? ? *? ? ? ? ? ? ? ? ?
- serif ? ? ? ? *? ? ? ? ? ? ? ? ?
- sans-serif ? ? ? ? *? ? ? ? ? ? ? ? ?
- ? ? ? ? *
- {@linkAlignment#ALIGN_NORMAL}正常 ? ? ? ? *
- {@linkAlignment#ALIGN_OPPOSITE}相反 ? ? ? ? *
- {@linkAlignment#ALIGN_CENTER}居中 ? ? ? ? *
需添加view.setMovementMethod(LinkMovementMethod.getInstance())
? ? ? ? *@paramclickSpan 點擊事件? ? ? ? *@return{@linkBuilder}? ? ? ? */publicBuildersetClickSpan(@NonNull ClickableSpan clickSpan){this.clickSpan = clickSpan;returnthis;? ? ? ? }/**? ? ? ? * 設置超鏈接? ? ? ? *需添加view.setMovementMethod(LinkMovementMethod.getInstance())
? ? ? ? *? ? ? ? *@paramurl 超鏈接? ? ? ? *@return{@linkBuilder}? ? ? ? */publicBuildersetUrl(@NonNull String url){this.url = url;returnthis;? ? ? ? }/**? ? ? ? * 設置模糊? ? ? ? *尚存bug罗售,其他地方存在相同的字體的話,相同字體出現(xiàn)在之前的話那么就不會模糊钩述,出現(xiàn)在之后的話那會一起模糊
? ? ? ? *推薦還是把所有字體都模糊這樣使用
? ? ? ? *? ? ? ? *@paramradius 模糊半徑(需大于0)? ? ? ? *@paramstyle? 模糊樣式- ? ? ? ? *? ? ? ? ? ? ?
- {@linkBlur#NORMAL} ? ? ? ? *? ? ? ? ? ? ?
- {@linkBlur#SOLID} ? ? ? ? *? ? ? ? ? ? ?
- {@linkBlur#OUTER} ? ? ? ? *? ? ? ? ? ? ?
- {@linkBlur#INNER} ? ? ? ? *? ? ? ? ? ? ?
* 設置樣式
*/privatevoidsetSpan(){intstart = mBuilder.length();? ? ? ? ? ? mBuilder.append(this.text);intend = mBuilder.length();if(foregroundColor != defaultValue) {? ? ? ? ? ? ? ? mBuilder.setSpan(newForegroundColorSpan(foregroundColor), start, end, flag);? ? ? ? ? ? ? ? foregroundColor = defaultValue;? ? ? ? ? ? }if(backgroundColor != defaultValue) {? ? ? ? ? ? ? ? mBuilder.setSpan(newBackgroundColorSpan(backgroundColor), start, end, flag);? ? ? ? ? ? ? ? backgroundColor = defaultValue;? ? ? ? ? ? }if(isLeadingMargin) {? ? ? ? ? ? ? ? mBuilder.setSpan(newLeadingMarginSpan.Standard(first, rest), start, end, flag);? ? ? ? ? ? ? ? isLeadingMargin =false;? ? ? ? ? ? }if(quoteColor != defaultValue) {? ? ? ? ? ? ? ? mBuilder.setSpan(newQuoteSpan(quoteColor), start, end,0);? ? ? ? ? ? ? ? quoteColor = defaultValue;? ? ? ? ? ? }if(isBullet) {? ? ? ? ? ? ? ? mBuilder.setSpan(newBulletSpan(gapWidth, bulletColor), start, end,0);? ? ? ? ? ? ? ? isBullet =false;? ? ? ? ? ? }if(proportion != -1) {? ? ? ? ? ? ? ? mBuilder.setSpan(newRelativeSizeSpan(proportion), start, end, flag);? ? ? ? ? ? ? ? proportion = -1;? ? ? ? ? ? }if(xProportion != -1) {? ? ? ? ? ? ? ? mBuilder.setSpan(newScaleXSpan(xProportion), start, end, flag);? ? ? ? ? ? ? ? xProportion = -1;? ? ? ? ? ? }if(isStrikethrough) {? ? ? ? ? ? ? ? mBuilder.setSpan(newStrikethroughSpan(), start, end, flag);? ? ? ? ? ? ? ? isStrikethrough =false;? ? ? ? ? ? }if(isUnderline) {? ? ? ? ? ? ? ? mBuilder.setSpan(newUnderlineSpan(), start, end, flag);? ? ? ? ? ? ? ? isUnderline =false;? ? ? ? ? ? }if(isSuperscript) {? ? ? ? ? ? ? ? mBuilder.setSpan(newSuperscriptSpan(), start, end, flag);? ? ? ? ? ? ? ? isSuperscript =false;? ? ? ? ? ? }if(isSubscript) {? ? ? ? ? ? ? ? mBuilder.setSpan(newSubscriptSpan(), start, end, flag);? ? ? ? ? ? ? ? isSubscript =false;? ? ? ? ? ? }if(isBold) {? ? ? ? ? ? ? ? mBuilder.setSpan(newStyleSpan(Typeface.BOLD), start, end, flag);? ? ? ? ? ? ? ? isBold =false;? ? ? ? ? ? }if(isItalic) {? ? ? ? ? ? ? ? mBuilder.setSpan(newStyleSpan(Typeface.ITALIC), start, end, flag);? ? ? ? ? ? ? ? isItalic =false;? ? ? ? ? ? }if(isBoldItalic) {? ? ? ? ? ? ? ? mBuilder.setSpan(newStyleSpan(Typeface.BOLD_ITALIC), start, end, flag);? ? ? ? ? ? ? ? isBoldItalic =false;? ? ? ? ? ? }if(fontFamily !=null) {? ? ? ? ? ? ? ? mBuilder.setSpan(newTypefaceSpan(fontFamily), start, end, flag);? ? ? ? ? ? ? ? fontFamily =null;? ? ? ? ? ? }if(align !=null) {? ? ? ? ? ? ? ? mBuilder.setSpan(newAlignmentSpan.Standard(align), start, end, flag);? ? ? ? ? ? ? ? align =null;? ? ? ? ? ? }if(imageIsBitmap || imageIsDrawable || imageIsUri || imageIsResourceId) {if(imageIsBitmap) {? ? ? ? ? ? ? ? ? ? mBuilder.setSpan(newImageSpan(Utils.context, bitmap), start, end, flag);? ? ? ? ? ? ? ? ? ? bitmap =null;? ? ? ? ? ? ? ? ? ? imageIsBitmap =false;? ? ? ? ? ? ? ? }elseif(imageIsDrawable) {? ? ? ? ? ? ? ? ? ? mBuilder.setSpan(newImageSpan(drawable), start, end, flag);? ? ? ? ? ? ? ? ? ? drawable =null;? ? ? ? ? ? ? ? ? ? imageIsDrawable =false;? ? ? ? ? ? ? ? }elseif(imageIsUri) {? ? ? ? ? ? ? ? ? ? mBuilder.setSpan(newImageSpan(Utils.context, uri), start, end, flag);? ? ? ? ? ? ? ? ? ? uri =null;? ? ? ? ? ? ? ? ? ? imageIsUri =false;? ? ? ? ? ? ? ? }else{? ? ? ? ? ? ? ? ? ? mBuilder.setSpan(newImageSpan(Utils.context, resourceId), start, end, flag);? ? ? ? ? ? ? ? ? ? resourceId =0;? ? ? ? ? ? ? ? ? ? imageIsResourceId =false;? ? ? ? ? ? ? ? }? ? ? ? ? ? }if(clickSpan !=null) {? ? ? ? ? ? ? ? mBuilder.setSpan(clickSpan, start, end, flag);? ? ? ? ? ? ? ? clickSpan =null;? ? ? ? ? ? }if(url !=null) {? ? ? ? ? ? ? ? mBuilder.setSpan(newURLSpan(url), start, end, flag);? ? ? ? ? ? ? ? url =null;? ? ? ? ? ? }if(isBlur) {? ? ? ? ? ? ? ? mBuilder.setSpan(newMaskFilterSpan(newBlurMaskFilter(radius, style)), start, end, flag);? ? ? ? ? ? ? ? isBlur =false;? ? ? ? ? ? }? ? ? ? ? ? flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;? ? ? ? }? ? }}
終點站
為了能讓乘客們調(diào)用地爽快與滿意寨躁,我真是把能囊括的span都收納過來了,終點站到了牙勘,如果對本次旅途滿意的話职恳,請給五星好評哦,畢竟老司機這次真的犧牲了很多時間與精力才換來這么一份精良的工具類方面,如果該工具類依賴其他工具類放钦,都可以在我的Android開發(fā)人員不得不收集的代碼(持續(xù)更新中)中找到。