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
@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自定义控件(三)——打造闪闪发光的字体相关推荐
- Android自定义控件:打造自己的QQ空间主页
前面已经实现过仿QQ的List抽屉效果以及仿QQ未读消息拖拽效果,具体请见: Android自定义控件:类QQ抽屉效果 Android自定义控件:类QQ未读消息拖拽效果 趁热打铁,这次我们实现QQ空间 ...
- Android 自定义控件之打造流布局实现热门搜索标签
转载请标明出处: http://blog.csdn.net/airsaid/article/details/50836296 本文出自:周游的博客 最终效果 具体实现 1自定义一个类继承ViewGro ...
- Android SurfaceView实战 打造抽奖转盘
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41722441 ,本文出自:[张鸿洋的博客] 1.概述 今天给大家带来Surfac ...
- Android自定义控件:从零开始实现魅族flyme6应用市场应用详情弹出式layout
前几天无意中发现魅族flyme6应用市场的应用详情界面非常有意思,作为一枚程序员,看到有意思的东西怎么办?当然是想办法自己也整一个啦,哈哈. 废话不多说,下面先看看魅族flyme6应用市场详情页弹出时 ...
- Android 自定义控件打造史上最简单的侧滑菜单
侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin ...
- Android自定义控件--仿安全卫士中的一键加速【圆形进度条】
最近看到a10615的:Android自定义控件–仿安全卫士中的一键加速.自己零零散散学习了几个月,也想尝试下.几天的功夫总算把它弄出来,虽然没有泓洋的强大,但是该有的自定义属性也有了,先来看看效果图 ...
- Android自定义控件:imageview重写onMeasure方法实现图片按指定比例显示,拉伸永不变形,解决屏幕适配问题
使用ImageView会遇到的问题 在Android应用中,都少不了图片的显示,ImageView,轮播图,ViewPager等等,很多都是来显示图片的,比如一个广告条的轮播效果,参看博客:广告条效果 ...
- Android 自定义控件 轻松实现360软件详情页
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 转载请标 ...
- 我的新书《Android自定义控件入门与实战》出版啦
前言:当你回首往事时,不以虚度年华而悔恨,不以碌碌无为而羞耻,那你就可以骄傲的跟自己讲,你不负此生 [Android自定义控件入门与实战]勘误:https://blog.csdn.net/harvic ...
最新文章
- c文本框只能输入数字_VBA代码限制文本框的输入
- 青少年编程竞赛交流群周报(第043周)
- 自学python爬虫要多久-入门Python爬虫要学习多久?
- oracle 导入流程,Oracle数据库(旧)空间数据表创建与数据导入流程说明V2.0
- C#微信开发小白成长教程二(新手接入指南,附视频)
- Spring是如何解决循环依赖的
- 实用收藏Linux命令备忘
- 人工智能——框架表示法
- form data怎么接收_VUE发送Formdata数据,NodeJS接收
- BZOJ 1507 [NOI2003]Editor
- c语言万年历的原理,[原创] C语言实现:万年历(1)
- 阿里云DataV数据过滤器取Value值大于等于25的数据(1)
- 计算机教师资格证面试题目,教师资格证面试常见结构化面试试题
- 泰凌微8258入门教程 基础篇⑤——发送数据流程
- Learning to Predict Context-adaptiveConvolution for Semantic Segmentation阅读笔记
- 楚留香服务器维护时间,2019年8月9日官方维护公告
- 用PYTHON做一个简单的游戏脚本(基础,详细)
- Vue3 究竟好在哪里?(和 React Hook 的详细对比)
- UltraISO制作U盘启动盘安装Win7/9/10系统攻略
- calwrf编译linux红帽,WRF模式运行手册
热门文章
- 11. RDMA之Shared Receive Queue
- 淘宝、拼多多模式的集合体——CRMEB商城
- 软件测试怎么跟踪缺陷,也谈软件测试缺陷跟踪管理
- 构建cherrytree所需的软件包
- JAVA 3DES加密 ECB模式 ZeroPadding填充
- Codeforces #158B Taxi
- php批量生成百度加密地址,用php改写百度mp3地址的加密模式
- 人工智能(crawler)—— 爬虫综合
- 凡人善举引领文明之风 山西介休举行“好人”颁奖典礼
- 基于ASP.NET C#的服装商城管理系统