Android自定義控件打造閃閃發(fā)光字體
介紹
在小米的開(kāi)機(jī)動(dòng)畫(huà)和一些歡迎界面中, 我們經(jīng)??吹竭@種閃閃發(fā)光的流光字體??雌饋?lái)很炫酷,其實(shí)實(shí)現(xiàn)原理相當(dāng)簡(jiǎn)單,我們只需要寫(xiě)自定義控件繼承TextView,然后使用渲染器Gradient設(shè)置顏色漸變和Paint的setShadowLayer方法設(shè)置陰影,然后不斷刷新改變位移即可。

實(shí)現(xiàn)
首先寫(xiě)一個(gè)shineTextView類(lèi)繼承自TextView.
public class ShineTextView extends TextView
{
// 線性漸變渲染
private LinearGradient mLinearGradient;
//環(huán)形漸變渲染
private RadialGradient mRadialGradient;
// 渲染矩陣
private Matrix mGradientMatrix;
// 畫(huà)筆
private Paint mPaint;
private int mViewWidth = 0;
// 亮度位移距離
private int mTranslate = 0;
public ShineTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
在這段代碼中 ,我們定義了兩個(gè)顏色渲染器
// 線性漸變渲染 private LinearGradient mLinearGradient; //環(huán)形漸變渲染 private RadialGradient mRadialGradient;
LinearGradient 是線性漸變渲染 ,代表顏色的漸變呈直線方向遞變。
我們可以使用LinearGradient 來(lái)實(shí)現(xiàn)上面第二張圖中的效果

RadialGradient 是環(huán)形漸變渲染 ,代表顏色的漸變呈圓環(huán)形遞變。
我們可以使用RadialGradient 來(lái)實(shí)現(xiàn)上面第一張圖中小米開(kāi)機(jī)動(dòng)畫(huà)的效果。

我們通過(guò)控制mTranslate 亮度位移距離來(lái)使顏色產(chǎn)生動(dòng)態(tài)變化的效果。
OnSizeChanged
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
if (mViewWidth == 0 || mViewHeight==0)
{
mViewWidth = getMeasuredWidth();
mViewHeight=getMeasuredHeight();
if (mViewWidth > 0 || mViewHeight>0 )
{
mPaint = getPaint();
// 創(chuàng)建RadialGradient對(duì)象
// 第一個(gè),第二個(gè)參數(shù)表示漸變圓中心坐標(biāo)
// 第三個(gè)參數(shù)表示半徑
// 第四個(gè),第五個(gè),第六個(gè)與線性渲染相同
mRadialGradient = new RadialGradient(50, 50,30, new int[] {
0x11FEB726, 0xffFEB726, 0x33FEB726 }, new float[] { 0,
0.5f, 1 }, Shader.TileMode.CLAMP);
// 創(chuàng)建LinearGradient對(duì)象
// 起始點(diǎn)坐標(biāo)(-mViewWidth, 0) 終點(diǎn)坐標(biāo)(0,0)
// 第一個(gè),第二個(gè)參數(shù)表示漸變起點(diǎn) 可以設(shè)置起點(diǎn)終點(diǎn)在對(duì)角等任意位置
// 第三個(gè),第四個(gè)參數(shù)表示漸變終點(diǎn)
// 第五個(gè)參數(shù)表示漸變顏色
// 第六個(gè)參數(shù)可以為空,表示坐標(biāo),值為0-1
// 如果這是空的,顏色均勻分布,沿梯度線。
// 第七個(gè)表示平鋪方式
// CLAMP重復(fù)最后一個(gè)顏色至最后
// MIRROR重復(fù)著色的圖像水平或垂直方向已鏡像方式填充會(huì)有翻轉(zhuǎn)效果
// REPEAT重復(fù)著色的圖像水平或垂直方向
mLinearGradient = new LinearGradient(-mViewWidth, 0, 0, 0,
new int[] { 0x33ffffff, 0xffffffff, 0x33ffffff },
new float[] { 0, 0.5f, 1 }, Shader.TileMode.CLAMP);
mPaint.setShader(mRadialGradient);
mPaint.setColor(Color.parseColor("#ffffffff"));
//設(shè)置字體陰影效果
//第一個(gè)參數(shù)代表陰影的半徑
//第二個(gè)參數(shù)代表陰影在X方向的延伸像素
//第三個(gè)參數(shù)代表陰影在Y方向的延伸像素
mPaint.setShadowLayer(3, 2, 2, 0xFFFF00FF);
mGradientMatrix = new Matrix();
}
}
}
在OnSizeChange方法中,我們主要完成一些初始化操作,比如獲取控件寬高、初始化顏色渲染器和設(shè)置字體陰影效果。
onDraw
接下來(lái)最后一步,我們只需要在onDraw方法中繪制效果,并且通過(guò)Matrix矩陣來(lái)使?jié)u變效果產(chǎn)生位移就可以了。
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
if ( mGradientMatrix != null)
{
mTranslateX += mViewWidth / 10;
mTranslateY += mViewHeight / 10;
if (mTranslateX > 2 * mViewWidth || mTranslateY >2*mViewHeight)
{
mTranslateX = -mViewWidth;
mTranslateY = -mViewHeight;
}
mGradientMatrix.setTranslate(mTranslateX, mTranslateY);
// mLinearGradient.setLocalMatrix(mGradientMatrix);
mRadialGradient.setLocalMatrix(mGradientMatrix);
postInvalidateDelayed(50);
}
}
源碼下載:http://xiazai.jb51.net/201701/yuanma/AndroidShineText(jb51.net).rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android系列---JSON數(shù)據(jù)解析的實(shí)例
JSON(JavaScript Object Notation)和XML,并稱(chēng)為客戶(hù)端和服務(wù)端交互解決方案的倚天劍和屠龍刀,這篇文章主要介紹了Android系列---JSON數(shù)據(jù)解析的實(shí)例,有興趣的可以了解一下。2016-11-11
詳解Android開(kāi)發(fā)中Activity的四種launchMode
這篇文章主要介紹了Android開(kāi)發(fā)中Activity的四種launchMode,launchMode主要用于控制多個(gè)Activity間的跳轉(zhuǎn),需要的朋友可以參考下2016-03-03
Android 中按home鍵和跳轉(zhuǎn)到主界面的實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家分享Android 中按home鍵和跳轉(zhuǎn)到主界面的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-04-04
Android編程開(kāi)發(fā)之打開(kāi)文件的Intent及使用方法
這篇文章主要介紹了Android編程開(kāi)發(fā)之打開(kāi)文件的Intent及使用方法,已實(shí)例形式分析了Android打開(kāi)文件Intent的相關(guān)布局及功能實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
淺談android Fragment橫豎屏翻轉(zhuǎn)對(duì)重新加載的要求
下面小編就為大家分享一篇淺談android Fragment橫豎屏翻轉(zhuǎn)對(duì)重新加載的要求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android開(kāi)發(fā)中Signal背后的bug與解決
這篇文章主要為大家介紹了Android開(kāi)發(fā)中Signal背后的bug與解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
android仿Adapter實(shí)現(xiàn)自定義PagerAdapter方法示例
這篇文章主要給大家介紹了關(guān)于android仿Adapter實(shí)現(xiàn)自定義PagerAdapter的相關(guān)資料,文中詳細(xì)介紹了關(guān)于PagerAdapter的用法,對(duì)大家的理解和學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Android實(shí)戰(zhàn)教程第一篇之最簡(jiǎn)單的計(jì)算器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)戰(zhàn)教程第一篇,如何實(shí)現(xiàn)最簡(jiǎn)單的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android模擬用戶(hù)點(diǎn)擊的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Android模擬用戶(hù)點(diǎn)擊的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)學(xué)習(xí)學(xué)習(xí)吧。2018-02-02

