您的位置:首页 > 其它

自定义控件之继承原控件

2016-02-04 14:55 411 查看
这篇博客介绍用继承原生控件的方式自定义控件,选用的例子比较简单,是一个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 : 组合渲染,可以和其他几个子类组合起来使用。

具体使用以后再介绍……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: