在View中有一些比较重要的回调方法,但是只需要重写特定的方法
onFinishInflate();
onSizeChanged();
onMeasure();
onLayout();
onTouchEvent();
自定义控件的实现方法
方法一:对现有控件进行拓展
public class MyTextView extends TextView {
private Paint mpaint1;
private Paint mpaint2;
private int mViewWidth = 0;
private LinearGradient mLinearGradient;
private Matrix matrix;
private int mtranslate = 0;
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mpaint1 = new Paint();
mpaint1.setColor(getResources().getColor(
android.R.color.holo_blue_light));
mpaint1.setStyle(Paint.Style.FILL);
mpaint2 = new Paint();
mpaint2.setColor(Color.YELLOW);
mpaint2.setStyle(Paint.Style.FILL);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mpaint1);
canvas.drawRect(10, 10, getMeasuredWidth() - 10,
getMeasuredHeight() - 10, mpaint2);
canvas.save();
canvas.translate(10, 0);
super.onDraw(canvas);
canvas.restore();
if (matrix != null){
mtranslate += mViewWidth / 5;
if(mtranslate > 2 * mViewWidth){
mtranslate = -mViewWidth;
}
matrix.setTranslate(mtranslate,0);
mLinearGradient.setLocalMatrix(matrix);
postInvalidateDelayed(100);
}
}
@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) {
mLinearGradient = new LinearGradient(0, 0, mViewWidth, 0,
new int[]{Color.GREEN, 0xffffffff, Color.RED}, null,
Shader.TileMode.CLAMP);
getPaint().setShader(mLinearGradient);
matrix = new Matrix();
}
}
}
}
方法二:通过组合实现新的控件
方法三:重写View来实现全新的控件
参考