国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義控件打造閃閃發光字體

2019-12-12 04:04:29
字體:
來源:轉載
供稿:網友

介紹

在小米的開機動畫和一些歡迎界面中, 我們經常看到這種閃閃發光的流光字體。看起來很炫酷,其實實現原理相當簡單,我們只需要寫自定義控件繼承TextView,然后使用渲染器Gradient設置顏色漸變和Paint的setShadowLayer方法設置陰影,然后不斷刷新改變位移即可。

 

實現

首先寫一個shineTextView類繼承自TextView.

public class ShineTextView extends TextView{  // 線性漸變渲染   private LinearGradient mLinearGradient;  //環形漸變渲染   private RadialGradient mRadialGradient;  // 渲染矩陣  private Matrix mGradientMatrix;  // 畫筆  private Paint mPaint;  private int mViewWidth = 0;  // 亮度位移距離  private int mTranslate = 0;  public ShineTextView(Context context, AttributeSet attrs) {    super(context, attrs);  }

在這段代碼中 ,我們定義了兩個顏色渲染器

// 線性漸變渲染 private LinearGradient mLinearGradient; //環形漸變渲染 private RadialGradient mRadialGradient;

LinearGradient 是線性漸變渲染 ,代表顏色的漸變呈直線方向遞變。
我們可以使用LinearGradient 來實現上面第二張圖中的效果

RadialGradient 是環形漸變渲染 ,代表顏色的漸變呈圓環形遞變。

我們可以使用RadialGradient 來實現上面第一張圖中小米開機動畫的效果。

我們通過控制mTranslate 亮度位移距離來使顏色產生動態變化的效果。

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();         // 創建RadialGradient對象         // 第一個,第二個參數表示漸變圓中心坐標         // 第三個參數表示半徑         // 第四個,第五個,第六個與線性渲染相同         mRadialGradient = new RadialGradient(50, 50,30, new int[] {            0x11FEB726, 0xffFEB726, 0x33FEB726 }, new float[] { 0,            0.5f, 1 }, Shader.TileMode.CLAMP);        // 創建LinearGradient對象        // 起始點坐標(-mViewWidth, 0) 終點坐標(0,0)        // 第一個,第二個參數表示漸變起點 可以設置起點終點在對角等任意位置         // 第三個,第四個參數表示漸變終點         // 第五個參數表示漸變顏色         // 第六個參數可以為空,表示坐標,值為0-1         // 如果這是空的,顏色均勻分布,沿梯度線。         // 第七個表示平鋪方式         // CLAMP重復最后一個顏色至最后         // MIRROR重復著色的圖像水平或垂直方向已鏡像方式填充會有翻轉效果         // REPEAT重復著色的圖像水平或垂直方向         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"));        //設置字體陰影效果        //第一個參數代表陰影的半徑        //第二個參數代表陰影在X方向的延伸像素        //第三個參數代表陰影在Y方向的延伸像素        mPaint.setShadowLayer(3, 2, 2, 0xFFFF00FF);        mGradientMatrix = new Matrix();      }    }  }

在OnSizeChange方法中,我們主要完成一些初始化操作,比如獲取控件寬高、初始化顏色渲染器和設置字體陰影效果。

onDraw

接下來最后一步,我們只需要在onDraw方法中繪制效果,并且通過Matrix矩陣來使漸變效果產生位移就可以了。

@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.VeVB.COm/201701/yuanma/AndroidShineText(VeVB.COm).rar

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湘乡市| 文安县| 浮山县| 政和县| 浮梁县| 定陶县| 托克托县| 巴彦县| 金平| 新泰市| 肃北| 射阳县| 建平县| 大冶市| 介休市| 文安县| 南开区| 阿拉善右旗| 武冈市| 思茅市| 英德市| 收藏| 河间市| 安塞县| 炉霍县| 鄂州市| 哈密市| 临澧县| 永宁县| 禹城市| 屏东县| 淮阳县| 澄江县| 晋江市| 沭阳县| 马关县| 治多县| 英德市| 霍林郭勒市| 文登市| 屏边|