Android自定義Span實現(xiàn)文字漸變效果
前言
Android
提供一些Span設置文本樣式外,開發(fā)者若希望實現(xiàn)一些新特性也是能自定義開發(fā)實現(xiàn)的。只要了解原生Android
底層是如何實現(xiàn)特殊樣式,在其基礎之上做一些創(chuàng)新就能夠把文本內(nèi)容玩出花來。
PS:本次先不探究TextView是如何解析加載底層實現(xiàn)文本樣式繪制,只介紹CharacterStyle類的實現(xiàn)。
ForegroundColorSpan解析
這里以ForegroundColorSpan
文本顏色樣式Span
舉例,其繼承CharacterStyle
也就是字符樣式頂層抽象類以及其樣式同樣也是繼承自它。
public class ForegroundColorSpan extends CharacterStyle implements UpdateAppearance, ParcelableSpan { private final int mColor; public ForegroundColorSpan(@ColorInt int color) { mColor = color; } ....... 忽略無關代碼 @ColorInt public int getForegroundColor() { return mColor; } /// 重要函數(shù) @Override public void updateDrawState(@NonNull TextPaint textPaint) { textPaint.setColor(mColor); } }
從ForegroundColorSpan
類源碼中可知文本顏色由入?yún)?code>int color決定,同時文本的繪制顏色更新是由textPaint
設置了入?yún)?code>color實現(xiàn)。從而得知文本樣式繪制主要由textPaint
實現(xiàn),textPaint
又是繼承自Paint
。只要對textPaint
做一些改變和參數(shù)設置也能實現(xiàn)自定義功能能力了。
文本顏色動畫漸變樣式實現(xiàn)
如圖所示實現(xiàn)文本顏色漸變效果,只需要自定義ForegroundColorSpan
在其基礎之上增加顏色更新變化即可實現(xiàn)如上效果。已知關鍵點是入?yún)?code>int color實時更新,因此只要修改顏色值并且在updateDrawState
函數(shù)上修改顏色值滿足以上兩點就能夠達到期望效果。
class MutableForegroundColorSpan : ForegroundColorSpan { // 動畫漸變值預設 companion object { val MUTABLE_FOREGROUND_COLOR_SPAN_FC_PROPERTY: Property<MutableForegroundColorSpan, Int> = object : Property<MutableForegroundColorSpan, Int>( Int::class.java, "MUTABLE_FOREGROUND_COLOR_SPAN_FC_PROPERTY" ) { override operator fun set(span: MutableForegroundColorSpan, value: Int) { span.foregroundColor = value } override operator fun get(span: MutableForegroundColorSpan): Int { return span.foregroundColor } } } private var mAlpha = 255 private var mForegroundColor: Int constructor(alpha: Int, color: Int) : super(color) { mAlpha = alpha mForegroundColor = color } // 原構造函數(shù)繼承 constructor(src: Parcel): super(src) { mForegroundColor = src.readInt() mAlpha = src.readInt() } override fun writeToParcel(dest: Parcel, flags: Int) { super.writeToParcel(dest, flags) dest.writeInt(mForegroundColor) dest.writeInt(mAlpha) } // 動畫設置 fun animationColorChange(startColor: Int,endColor:Int) : ObjectAnimator{ val objectAnimator: ObjectAnimator = ObjectAnimator.ofInt( this, MutableForegroundColorSpan.MUTABLE_FOREGROUND_COLOR_SPAN_FC_PROPERTY, startColor, endColor ) objectAnimator.setEvaluator(ArgbEvaluator()) objectAnimator.duration = 3000 return objectAnimator } // 透明度 fun setAlpha(alpha: Int) { mAlpha = alpha } fun setForegroundColor(foregroundColor: Int) { mForegroundColor = foregroundColor } // 更新畫筆顏色 override fun updateDrawState(ds: TextPaint) { ds.color = foregroundColor } // 獲取文本顏色 override fun getForegroundColor(): Int { return Color.argb( mAlpha, Color.red(mForegroundColor), Color.green(mForegroundColor), Color.blue(mForegroundColor) ) } } // 樣式設置 監(jiān)聽動畫回調(diào)重新設置樣式從而刷新文本 private var mutableForegroundColorSpan = MutableForegroundColorSpan(255, Color.BLACK) mutableForegroundColorSpan.animationColorChange( Color.BLACK, Color.RED ).run { addUpdateListener { mutableForegroundColorView.text = animationColor() } start() } // 文本樣式配置 private fun animationColor(): SpannableStringBuilder { var spannableString = SpannableStringBuilder("") spannableString.also { span -> span.append(SpannableString("xxxxMutableForegroundColorSpanyyyy").also { it.setSpan( mutableForegroundColorSpan, 4, "MutableForegroundColorSpan".length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ) }) } return spannableString }
以上是實現(xiàn)文本漸變效果代碼,增加實時刷新文本顏色之后就能夠讓文本顏色變化呈現(xiàn)動畫效果。其也能拓展功能例如從透明逐步可見也是另外一種特別效果。此外內(nèi)置動畫效果同樣也能以動畫類的能力來設置循環(huán)次數(shù)等其他動畫應有的功能。
小結
改造ForegroundColorSpan
類外結合動畫能力還能為文本樣式創(chuàng)作做更多好玩效果。在此不一一例舉開發(fā)者可以根據(jù)業(yè)務需要和想象力自行設置實現(xiàn)更有趣的內(nèi)容效果。
以上就是Android自定義Span實現(xiàn)文字漸變效果的詳細內(nèi)容,更多關于Android Span文字漸變的資料請關注腳本之家其它相關文章!
相關文章
詳解Android應用開發(fā)中Intent的作用及使用方法
這篇文章主要介紹了Android應用開發(fā)中Intent的作用與用法,包括如何激活Activity組件與Intent的投遞等,需要的朋友可以參考下2016-03-03Android Messenger實現(xiàn)進程間雙向通信
這篇文章主要為大家詳細介紹了Messenger實現(xiàn)進程間雙向通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05Android開發(fā) -- 狀態(tài)欄通知Notification、NotificationManager詳解
本文主要講解狀態(tài)欄通知Notification、NotificationManager,小編覺得非常詳細,給大家一個參考,希望對大家學習有所幫助。2016-06-06Android中實現(xiàn)EditText密碼顯示隱藏的方法
這篇文章主要介紹了Android中實現(xiàn)EditText密碼顯示隱藏的方法,需要的朋友可以參考下2017-01-01Android之使用Android-query框架開發(fā)實戰(zhàn)(一)
這篇文章主要介紹了Android之使用Android-query框架開發(fā)實戰(zhàn)(一)的相關資料,需要的朋友可以參考下2015-10-10