自定义控件之继承原控件
2016-02-04 14:55
411 查看
这篇博客介绍用继承原生控件的方式自定义控件,选用的例子比较简单,是一个textview闪动效果,先上代码:
这个效果主要是利用LinearGradient和Matrix来实现一个动态的文字闪动效果。利用Android中Paint对象的Shader渲染器,通过设置一个不断变化的LinearGradient,并使用带有该属性的Paint对象来绘制要显示的文字。
在onSizeChange方法中进行一些对象的初始化工作,其中最关键的是使用getPaint()方法获取当前绘制Textview的Paint对象,并给这个Paint对象设置原生Textview没有的LinearGradient属性。最后,在onDraw()方法中,通过矩阵的方式不断平移渐变效果,从而在绘制文字时,产生动态闪动效果。
这个代码中有个渲染器(shader)概念,这边介绍下:
Android提供的Shader类主要是渲染图像以及一些几何图形。
Shader有几个直接子类:
BitmapShader : 主要用来渲染图像
LinearGradient :用来进行线性渲染
RadialGradient : 用来进行环形渲染
SweepGradient : 扫描渐变—围绕一个中心点扫描渐变就像电影里那种雷达扫描,用来梯度渲染。
ComposeShader : 组合渲染,可以和其他几个子类组合起来使用。
具体使用以后再介绍……
public class MyTextView extends TextView { private int mViewWidth;//控件的宽度 private Paint mPaint;//绘制需要的画笔 private LinearGradient mLinearGradient;//线性变化渲染器 private Matrix mGradientMatrix;//变化矩阵 private int mTranslate;//位移的距离 public MyTextView(Context context) { super(context); } public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); } public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (mViewWidth == 0) { mViewWidth = getMeasuredWidth(); if (mViewWidth > 0) { mPaint = getPaint(); mLinearGradient = new LinearGradient(0, 0, mViewWidth, 0, new int[]{Color.BLUE, 0xffffffff, Color.BLUE}, null, Shader.TileMode.CLAMP); mPaint.setShader(mLinearGradient); mGradientMatrix = new Matrix(); } } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mGradientMatrix != null){ mTranslate += mViewWidth / 5;//每次位移控件宽度的20% if (mTranslate > 2 * mViewWidth){//当位移距离超过控件宽度的2倍时,将位移位子复原 mTranslate = -mViewWidth; } mGradientMatrix.setTranslate(mTranslate,0);//设置平移矩阵 mLinearGradient.setLocalMatrix(mGradientMatrix);//将矩阵变化设置回渲染器中 postInvalidateDelayed(100);//100ms后刷新,将会调用onDraw方法,这样就反复调用onDraw } } }
这个效果主要是利用LinearGradient和Matrix来实现一个动态的文字闪动效果。利用Android中Paint对象的Shader渲染器,通过设置一个不断变化的LinearGradient,并使用带有该属性的Paint对象来绘制要显示的文字。
在onSizeChange方法中进行一些对象的初始化工作,其中最关键的是使用getPaint()方法获取当前绘制Textview的Paint对象,并给这个Paint对象设置原生Textview没有的LinearGradient属性。最后,在onDraw()方法中,通过矩阵的方式不断平移渐变效果,从而在绘制文字时,产生动态闪动效果。
这个代码中有个渲染器(shader)概念,这边介绍下:
Android提供的Shader类主要是渲染图像以及一些几何图形。
Shader有几个直接子类:
BitmapShader : 主要用来渲染图像
LinearGradient :用来进行线性渲染
RadialGradient : 用来进行环形渲染
SweepGradient : 扫描渐变—围绕一个中心点扫描渐变就像电影里那种雷达扫描,用来梯度渲染。
ComposeShader : 组合渲染,可以和其他几个子类组合起来使用。
具体使用以后再介绍……
相关文章推荐
- 2015年简单总结
- 通过userAgent判断手机浏览器类型
- Mac开发:NSTableView教程
- 快速幂取模算法
- 前端
- 技术走向管理一些思考(2)-建立管理思维
- 终端编写c程序
- 请先点我!
- ubuntu14.04安装notepadqq
- Installations
- C++编译器与链接器工作原理
- 剖析width、height继承
- ios iphone5s (64位处理器原因) 及以后通过 AsyncSocket TCP 通信 出现服务器端接收超时,导致无法通信
- [openresty] hello world
- 一些图片
- 为非列表元素设置列表样式
- Core Graphics之(一):绘制线段、线段的设置
- UINavigationController和UIScrollView一起使用时导致UIScrollView位置偏移
- curl命令总结
- locate 命令