由于项目需求,需要做一个app锁屏页,其中就有一个需要滑动解锁的文字流光效果。我这里通过自定义Textview来实现:
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
final ValueAnimator animator = ValueAnimator.ofInt(0, 2*getMeasuredHeight());//这里使用到了ValueAnimation,
//2*getMeasuredHeight()是移动距离为2倍的文本高度
mValueAnimator = animator;
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
mDx = (Integer) animator.getAnimatedValue();//这个是记录当前要移动的位置
postInvalidate();
}
});
animator.setRepeatMode(ValueAnimator.RESTART);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setDuration(2000);
animator.start();
mLinearGradient = new LinearGradient(0, 2*getMeasuredHeight(), 0, 0, new int[]{getCurrentTextColor(), 0xff00ff00, getCurrentTextColor()},
new float[]{0, 0.5f, 1}, Shader.TileMode.CLAMP);//使用LinearGradient是为了实现一个渐变效果
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mHeight = h;
mWidth = w;
}
@Override
protected void onDraw(Canvas canvas) {
Matrix matrix = new Matrix();//使用Matrix记录光条移动路径 matrix.setTranslate(0, -mDx); mLinearGradient.setLocalMatrix(matrix);
mPaint.setShader(mLinearGradient);//setShader方法将光条绘制出来
super.onDraw(canvas);
}
public void stopAnimator() {
if (mValueAnimator != null) {
mValueAnimator.end();
}
}
public void startAnimator() {
if (mValueAnimator != null) {
mValueAnimator.start();
}
}
实现的效果图:
实现这个需求主要用到了一个ValueAnimation和LinearGradient,以及Paint中的setShader方法。具体用法可以自行了解!