android群英传笔记——对现有控件进行拓展(闪动的文字效果)

这是我第一次写博客同时也是刚接触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);
        }
    }

}

感谢阅读,学习重在坚持,贵在坚持,下次再见。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值