自定义控件之继承原控件

这篇博客介绍用继承原生控件的方式自定义控件,选用的例子比较简单,是一个textview闪动效果,先上代码:

public class MyTextView extends TextView {

    private int mViewWidth;//控件的宽度

    private Paint mPaint;//绘制需要的画笔

    private LinearGradient mLinearGradient;//线性变化渲染器

    private Matrix mGradientMatrix;//变化矩阵

    private int mTranslate;//位移的距离

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

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

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

    @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;//每次位移控件宽度的20%
            if (mTranslate > 2 * mViewWidth){//当位移距离超过控件宽度的2倍时,将位移位子复原
                mTranslate = -mViewWidth;
            }
            mGradientMatrix.setTranslate(mTranslate,0);//设置平移矩阵
            mLinearGradient.setLocalMatrix(mGradientMatrix);//将矩阵变化设置回渲染器中
            postInvalidateDelayed(100);//100ms后刷新,将会调用onDraw方法,这样就反复调用onDraw
        }
    }
}

这个效果主要是利用LinearGradient和Matrix来实现一个动态的文字闪动效果。利用Android中Paint对象的Shader渲染器,通过设置一个不断变化的LinearGradient,并使用带有该属性的Paint对象来绘制要显示的文字。
在onSizeChange方法中进行一些对象的初始化工作,其中最关键的是使用getPaint()方法获取当前绘制Textview的Paint对象,并给这个Paint对象设置原生Textview没有的LinearGradient属性。最后,在onDraw()方法中,通过矩阵的方式不断平移渐变效果,从而在绘制文字时,产生动态闪动效果。

这个代码中有个渲染器(shader)概念,这边介绍下:
Android提供的Shader类主要是渲染图像以及一些几何图形。
Shader有几个直接子类:
BitmapShader : 主要用来渲染图像
LinearGradient :用来进行线性渲染
RadialGradient : 用来进行环形渲染
SweepGradient : 扫描渐变—围绕一个中心点扫描渐变就像电影里那种雷达扫描,用来梯度渲染。
ComposeShader : 组合渲染,可以和其他几个子类组合起来使用。

具体使用以后再介绍……

你可能感兴趣的:(自定义控件)