Android自定义控件打造闪闪发光字体

 更新时间:2017年01月09日 16:38:18   作者:aNotFound404  
这篇文章主要为大家详细介绍了Android自定义控件打造闪闪发光字体,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

介绍

在小米的开机动画和一些欢迎界面中, 我们经常看到这种闪闪发光的流光字体。看起来很炫酷,其实实现原理相当简单,我们只需要写自定义控件继承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.jb51.net/201701/yuanma/AndroidShineText(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android系列---JSON数据解析的实例

    Android系列---JSON数据解析的实例

    JSON(JavaScript Object Notation)和XML,并称为客户端和服务端交互解决方案的倚天剑和屠龙刀,这篇文章主要介绍了Android系列---JSON数据解析的实例,有兴趣的可以了解一下。
    2016-11-11
  • 详解Android开发中Activity的四种launchMode

    详解Android开发中Activity的四种launchMode

    这篇文章主要介绍了Android开发中Activity的四种launchMode,launchMode主要用于控制多个Activity间的跳转,需要的朋友可以参考下
    2016-03-03
  • Android 中按home键和跳转到主界面的实例代码

    Android 中按home键和跳转到主界面的实例代码

    本文通过实例代码给大家分享Android 中按home键和跳转到主界面的方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-04-04
  • Kotlin集合List Set Map使用介绍详解

    Kotlin集合List Set Map使用介绍详解

    集合是可变数量(可能为0)的一组条目,kotlin标准库提供一个整套用于集合管理的工具,各种集合对于解决问题都具有重要意义,并且经常用到。kotlin中的集合与Java基本类似
    2022-09-09
  • Android编程开发之打开文件的Intent及使用方法

    Android编程开发之打开文件的Intent及使用方法

    这篇文章主要介绍了Android编程开发之打开文件的Intent及使用方法,已实例形式分析了Android打开文件Intent的相关布局及功能实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • 浅谈android Fragment横竖屏翻转对重新加载的要求

    浅谈android Fragment横竖屏翻转对重新加载的要求

    下面小编就为大家分享一篇浅谈android Fragment横竖屏翻转对重新加载的要求,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Android开发中Signal背后的bug与解决

    Android开发中Signal背后的bug与解决

    这篇文章主要为大家介绍了Android开发中Signal背后的bug与解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • android仿Adapter实现自定义PagerAdapter方法示例

    android仿Adapter实现自定义PagerAdapter方法示例

    这篇文章主要给大家介绍了关于android仿Adapter实现自定义PagerAdapter的相关资料,文中详细介绍了关于PagerAdapter的用法,对大家的理解和学习具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • Android实战教程第一篇之最简单的计算器

    Android实战教程第一篇之最简单的计算器

    这篇文章主要为大家详细介绍了Android实战教程第一篇,如何实现最简单的计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android模拟用户点击的实现方法

    Android模拟用户点击的实现方法

    这篇文章主要给大家介绍了关于Android模拟用户点击的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学学习学习吧。
    2018-02-02

最新评论