博主刚接触自定义控件时间并不是很长,只会写一些比较简单的自定义控件,当然对自定义控件的认识也停留在初级阶段。即 onMeasure、onLayout和onDraw三个方法的理解上。当然要写出一个高效的自定义控件仅仅掌握着三个方法是远远不够的,例如在绘制自定义View时,一些比较重要的回调方法。
比较熟悉的有:onFinishInflate():从XML加载组件后回调; onTouchEvent:监听到触摸事件时回调; onSizeChanged:组件大小改变时回调;
结合第三个方法,下面来写一个常见的自定义View;
实现效果:实现一个动态文字闪动效果的TextView;
具体实现代码如下:
1、在onSizeChanged中监听LinearGrddient的width的不断变化,并给与不同颜色数组
<span style="white-space:pre"> </span>@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) {
mGridGradient = new LinearGradient(-mViewWidth,
0, 0, 0, new int[] {
Color.BLUE, Color.GRAY,Color.YELLOW}, null,
Shader.TileMode.CLAMP);
mPaint=getPaint();
mPaint.setShader(mGridGradient);
}
}
}
2、在onDraw方法中不断改变LinearGradient的width即可。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Matrix matrix=new Matrix();
offset+=mViewWidth/8;
if(offset>mViewWidth*2){
offset=-mViewWidth;
}
matrix.setTranslate(offset, 0);
mGridGradient.setLocalMatrix(matrix);
postInvalidateDelayed(50);
}