欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義Span實現(xiàn)文字漸變效果

 更新時間:2022年06月14日 09:43:40   作者:JulyYu  
Android提供一些Span設置文本樣式外,開發(fā)者若希望實現(xiàn)一些新特性也是能自定義開發(fā)實現(xiàn)的。本文就將自定義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文字漸變的資料請關注腳本之家其它相關文章!

相關文章

最新評論