这是我第一次写博客同时也是刚接触android开发,如果有什么不对的地方请多多包含。
闪动的文字效果
此处利用LinearGradient Shader和Matrix来实现动态的文字闪动效果,效果如图所示:
想要实现这一效果,可以充分利用android中Paint对象的Shader渲染器。
设置一个不断变化的LinearGradient,使用带有属性的Paint对象来绘制要显示的文字。首先,在
onSizeChanged()方法中进行对象的初始化,代码如下所示:
@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(
// 起始点的x位置
0,
// 起始点的y位置
0,
// 终点的x位置
mViewWidth,
// 终点的y位置
0,
// 渐变颜色
new int[]{
Color.BLUE, 0xffffffff,
Color.BLUE
},
null,
// 平铺方式
Shader.TileMode.CLAMP
);
// 为画笔设置着色器
mPaint.setShader(mLinearGradient);
// 设置倾斜矩形
mGradientMatrix = new Matrix();
}
}
}
最后,在onDraw()方法中,通过矩阵的方式来不断平移渐变效果,从而在绘制文字时,产生动态的闪动效果,代码如下所示:
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
// 判断是否实例化矩形(执行顺序理论上是先执行onSizeChanged()方法后再执行此方法)
if(mGradientMatrix != null){
// 距离每次增加总宽的五分之一
mTranslate += mViewWidth/5;
// 超过两个画布长度就重新回到画布以外,防止出现闪屏的效果
if(mTranslate > 2*mViewWidth){
mTranslate = -mViewWidth;
}
// 给矩阵设置过度效果和初始点
mGradientMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mGradientMatrix);
// 延迟重绘(设置为100ms)
postInvalidateDelayed(100);
}
}
以上就是闪动文字的实现方法,其实可以通过res资源目录的values目录下创建一个attrs.xml的属性定义文件来自定义属性,比如设置闪动的速度或是闪动的矩形大小。
代码
以下是完整代码:
package com.example.customConcrols;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* 重写TextView控件,闪动的文字效果
* Created by shize on 2016/8/29.
*/
public class CustomTextView extends TextView {
private int mViewWidth = 0;
// 水平方向上平移的距离
private int mTranslate = 0;
private LinearGradient mLinearGradient;
private Matrix mGradientMatrix;
private Paint mPaint;
public CustomTextView(Context context) {
super(context);
}
// 此处必须使用构造方法二(没有程序会报错)
public CustomTextView(Context context, AttributeSet attrs){
super(context,attrs);
}
@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;
if(mTranslate > 2*mViewWidth){
mTranslate = -mViewWidth;
}
mGradientMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mGradientMatrix);
// 延迟重绘
postInvalidateDelayed(100);
}
}
}
感谢阅读,学习重在坚持,贵在坚持,下次再见。