Android给我们提供了丰富的组件库来创建丰富的UI效果,同时也提供了非常方便的拓展方法。通过继承Android的系统组件,我们可以非常方便的拓展现有功能,在系统组件的基础上创建新的功能,甚至可以直接自定义一个控件,实现Android系统控件所没有的功能。适当地使用自定义View,可以丰富应用程序的体验效果。
下面通过利用LinearGradient Shader和Matrix来实现一个动态的文字闪动效果,程序运行效果如下图所示:
要想实现这个效果,可以充分利用Android中对Paint对象的Shader渲染器。通过设置一个不断变化的LinearGradient,并使用带有该属性的Paint对象来绘制要显示的文字。首先在onSizeChanged()方法中进行一些对象的初始化工作,并根据View的宽高设置一个LinearGradient渐变渲染器,代码如下所示:
@Override其中最关键的是使用getPaint()方法获取当前绘制TextView的Paint对象,并给这个Paint对象设置原生的TextView没有的LinearGradient属性。最后,在onDraw()方法中,通过矩阵的方式不断平移渐变效果,从而在绘制文字时,产生动态的闪动效果,代码如下所示:
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
super.onSizeChanged(width, height, oldWidth, oldHeight);
if (mViewWidth == 0) {
mViewWidth = getMeasuredWidth();
if (mViewWidth > 0) {
mPaint = getPaint();
mLinearGradient = new LinearGradient(0, 0, mViewWidth, 0, new int[]{
Color.BLUE, 0xffffffff,
Color.RED
}, null, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
mGradientMatrix = new Matrix();
}
}
}
@OverrideDemo源代码下载地址:http://download.csdn.net/detail/lfeng1205/9609944
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mGradientMatrix != null) {
mTranslate += mViewWidth / 5;
if (mTranslate > 2 * mViewWidth) {
mTranslate = -mViewWidth;
}
mGradientMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mGradientMatrix);
postInvalidateDelayed(100);
}
}