Android运用自定义控件实现闪烁字

项目中要用到闪烁字来标识一些重要的提醒以及醒目的文字等,这里Android并没有为我们提供一些组件,这里可以使用自定义的TextView,运用paint设置渐变渲染器LinearGradient来实现。

先看一下实现的效果,由于写的仓促就没有做动图了。。。就是一个蓝色的渐变:

先来看一下渐变渲染器的LinearGradient的API

构造方法


可以看到,需要传递的参数分别是沿着一条直线的梯度变化坐标点和梯度渐变的颜色数组。这里我们就可以为我们的paint设置LinearGradient来绘制这个控件。

实现代码:

如果控件要支持wrap_content的控件大小的时候,自定义控件的时候必须重写onMeasure()方法,去给出指定的大小。

<span style="font-size:18px;">public class SharderTextView extends TextView {
    //控件的宽
    int mViewWidth;
    //平移量
    int mTransLate;
    private TextPaint paint;
    private LinearGradient mlinearGradient;
    private Matrix matrix;

    public SharderTextView(Context context) {
        super(context);
    }

    public SharderTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SharderTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(measureWidth(widthMeasureSpec),measureHigth(heightMeasureSpec));
    }

    /**
     * 测量宽的方法
     * @param measureSpec
     * @return
     */
    private int measureWidth(int measureSpec){
        int result = 0;
        int measureMode = MeasureSpec.getMode(measureSpec);
        int size = MeasureSpec.getSize(measureSpec);
        if(measureMode == MeasureSpec.EXACTLY)
        {
            result = size;
        }else{
            result = 200;
            //当控件为warp_content时
            if(measureMode ==MeasureSpec.AT_MOST)
            {
                result = Math.min(result,size);
            }
        }
        return result;
    }

    /**
     * 测量控件高度的方法
     * @param measureSpec
     * @return
     */
    private int measureHigth(int measureSpec)
    {
        int result = 0;
        int measureMode = MeasureSpec.getMode(measureSpec);
        int size = MeasureSpec.getSize(measureSpec);
        if(measureMode == MeasureSpec.EXACTLY)
        {
            result = size;
        }else{
            result = 200;
            if(measureMode == MeasureSpec.AT_MOST)
            {
                result = Math.min(result,size);
            }
        }
        return result;
    }
    @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)
        {
            //获取绘制当前TextView的paint对象
            paint = getPaint();
            //创建渲染渐变器
            mlinearGradient = new LinearGradient(0,0,mViewWidth,0,new int[]{Color.BLUE,0xffffffff,Color.BLUE},null, Shader.TileMode.CLAMP);
            paint.setShader(mlinearGradient);
            matrix = new Matrix();
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(matrix!=null)
        {
            mTransLate+=mViewWidth/5;
            if(mTransLate>2*mViewWidth)
            {
                mTransLate = -mViewWidth;
            }
            matrix.setTranslate(mTransLate,0);
            mlinearGradient.setLocalMatrix(matrix);
            postInvalidateDelayed(100);
        }
    }
}
</span>


基本就是这样的一个简单的实现,水平有限,欢迎批评指教

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值