介绍

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

@Overrideprotected 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矩阵来使渐变效果产生位移就可以了。

@Overrideprotected 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);}}

源码下载

Android自定义控件(三)——打造闪闪发光的字体相关推荐

  1. Android自定义控件:打造自己的QQ空间主页

    前面已经实现过仿QQ的List抽屉效果以及仿QQ未读消息拖拽效果,具体请见: Android自定义控件:类QQ抽屉效果 Android自定义控件:类QQ未读消息拖拽效果 趁热打铁,这次我们实现QQ空间 ...

  2. Android 自定义控件之打造流布局实现热门搜索标签

    转载请标明出处: http://blog.csdn.net/airsaid/article/details/50836296 本文出自:周游的博客 最终效果 具体实现 1自定义一个类继承ViewGro ...

  3. Android SurfaceView实战 打造抽奖转盘

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41722441 ,本文出自:[张鸿洋的博客] 1.概述 今天给大家带来Surfac ...

  4. Android自定义控件:从零开始实现魅族flyme6应用市场应用详情弹出式layout

    前几天无意中发现魅族flyme6应用市场的应用详情界面非常有意思,作为一枚程序员,看到有意思的东西怎么办?当然是想办法自己也整一个啦,哈哈. 废话不多说,下面先看看魅族flyme6应用市场详情页弹出时 ...

  5. Android 自定义控件打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin ...

  6. Android自定义控件--仿安全卫士中的一键加速【圆形进度条】

    最近看到a10615的:Android自定义控件–仿安全卫士中的一键加速.自己零零散散学习了几个月,也想尝试下.几天的功夫总算把它弄出来,虽然没有泓洋的强大,但是该有的自定义属性也有了,先来看看效果图 ...

  7. Android自定义控件:imageview重写onMeasure方法实现图片按指定比例显示,拉伸永不变形,解决屏幕适配问题

    使用ImageView会遇到的问题 在Android应用中,都少不了图片的显示,ImageView,轮播图,ViewPager等等,很多都是来显示图片的,比如一个广告条的轮播效果,参看博客:广告条效果 ...

  8. Android 自定义控件 轻松实现360软件详情页

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载请标 ...

  9. 我的新书《Android自定义控件入门与实战》出版啦

    前言:当你回首往事时,不以虚度年华而悔恨,不以碌碌无为而羞耻,那你就可以骄傲的跟自己讲,你不负此生 [Android自定义控件入门与实战]勘误:https://blog.csdn.net/harvic ...

最新文章

  1. c文本框只能输入数字_VBA代码限制文本框的输入
  2. 青少年编程竞赛交流群周报(第043周)
  3. 自学python爬虫要多久-入门Python爬虫要学习多久?
  4. oracle 导入流程,Oracle数据库(旧)空间数据表创建与数据导入流程说明V2.0
  5. C#微信开发小白成长教程二(新手接入指南,附视频)
  6. Spring是如何解决循环依赖的
  7. 实用收藏Linux命令备忘
  8. 人工智能——框架表示法
  9. form data怎么接收_VUE发送Formdata数据,NodeJS接收
  10. BZOJ 1507 [NOI2003]Editor
  11. c语言万年历的原理,[原创] C语言实现:万年历(1)
  12. 阿里云DataV数据过滤器取Value值大于等于25的数据(1)
  13. 计算机教师资格证面试题目,教师资格证面试常见结构化面试试题
  14. 泰凌微8258入门教程 基础篇⑤——发送数据流程
  15. Learning to Predict Context-adaptiveConvolution for Semantic Segmentation阅读笔记
  16. 楚留香服务器维护时间,2019年8月9日官方维护公告
  17. 用PYTHON做一个简单的游戏脚本(基础,详细)
  18. Vue3 究竟好在哪里?(和 React Hook 的详细对比)
  19. UltraISO制作U盘启动盘安装Win7/9/10系统攻略
  20. calwrf编译linux红帽,WRF模式运行手册

热门文章

  1. 11. RDMA之Shared Receive Queue
  2. 淘宝、拼多多模式的集合体——CRMEB商城
  3. 软件测试怎么跟踪缺陷,也谈软件测试缺陷跟踪管理
  4. 构建cherrytree所需的软件包
  5. JAVA 3DES加密 ECB模式 ZeroPadding填充
  6. Codeforces #158B Taxi
  7. php批量生成百度加密地址,用php改写百度mp3地址的加密模式
  8. 人工智能(crawler)—— 爬虫综合
  9. 凡人善举引领文明之风 山西介休举行“好人”颁奖典礼
  10. 基于ASP.NET C#的服装商城管理系统