android开发自定义TextView文本流光效果——滑动解锁

 

由于项目需求,需要做一个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(); 
} 
}

 

实现的效果图:

android开发自定义TextView文本流光效果——滑动解锁_第1张图片android开发自定义TextView文本流光效果——滑动解锁_第2张图片android开发自定义TextView文本流光效果——滑动解锁_第3张图片

实现这个需求主要用到了一个ValueAnimation和LinearGradient,以及Paint中的setShader方法。具体用法可以自行了解!

你可能感兴趣的:(android开发自定义TextView文本流光效果——滑动解锁)