【Android UI】自定义TextView实现动态的文字闪动效果

这段时间一直在看自定义View感觉很有意思,今天刚刚看到了一个实现动态的文字闪动效果的自定义TextView,其原理是利用LinearGradient和Matrix来实现的,运行效果如下:

【Android UI】自定义TextView实现动态的文字闪动效果_第1张图片

要想实现这一个效果,可以充分利用Android中Paint对象的Shader渲染器。通过设置一个不断变化的LinearGradient,并使用带有该属性的Paint对象来绘制要显示的文字。首先,在onSizeChanged()方法中进行一些对象的初始化工作,并根据View的宽带设置一个LinearGradient渐变渲染器,代码如下所示:

@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();
        }
    }
}

其中最关键的就是使用getPaint()方法获取当前绘制的TextView的Paint对象,并给这个Paint对象设置原生TextView没有的LinearGradient属性。最后,在onDraw()方法中,通过矩阵的方式不断平移渐变效果,从而在绘制文字时,产生动态的闪动效果,代码如下:

@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);
    }
}

你可能感兴趣的:(Android学习)