重要的回调方法
首先,我们应该了解一下比较重要的回调方法:
- onFinishInflate() 从XML加载组件后回调
- onSizeChanged() 组件大小改变后回调
- onMeasure(int widthMeasureSpec, int heightMeasureSpec)回调该方法进行测量
- onLayout(boolean changed, int left, int top, int right, int bottom)回调该方法确定显示位置
- onTouchEvent(MotionEvent event) 监听到触摸事件时的回调
以上就是集中常用的回调的方法.
接下来做一个实验:
实验一: 自定义一个带边框的TextView
public class CustomTextView extends TextView {
//初始化画笔
Paint mPaint1;
Paint mPaint2;
public CustomTextView(Context context) {
super(context);
}
public CustomTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
mPaint1=new Paint();
mPaint1.setColor(Color.GREEN);
//STROKE 表示只画一条线
//Fill表示填满整个View
mPaint1.setStyle(Paint.Style.STROKE);
mPaint2=new Paint();
mPaint2.setColor(getResources().getColor(android.R.color.holo_blue_light));
mPaint2.setStyle(Paint.Style.FILL_AND_STROKE);
//绘制外层矩形
canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint1);
//绘制内层矩形
canvas.drawRect(10,10,getMeasuredWidth()-10,getMeasuredHeight()-10,mPaint2);
canvas.save();//保存画布的状态
//绘制文字前平移10个像素
canvas.translate(10,0);
//在回调父类的方法前实现自己的逻辑,对TextView来说就是在绘制文本内容前
super.onDraw(canvas);
//在回调父类的方法前实现自己的逻辑,对TextView来说就是在绘制文本内容后
}
}
实验二:自定义一个酷炫的TextView
public class CoolTextView extends TextView {
private int mViewWidth;
//初始化画笔
private Paint mPaint;
//渲染器
private LinearGradient mLinearGradient;
//矩阵
private Matrix matrix;
private int mTranslate;
public CoolTextView(Context context) {
super(context);
}
public CoolTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mPaint=new Paint();
if (mViewWidth==0){
mViewWidth=getMeasuredWidth();
if (mViewWidth>0){
//获取当前TextView的画笔
mPaint=getPaint();
//渲染器
mLinearGradient=new LinearGradient(0,0,mViewWidth,0,
new int[]{Color.BLUE, 0xffffffff, Color.BLUE},
null, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
matrix=new Matrix();
}
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (matrix!=null){
//修改可以改变显示的速度
mTranslate+=mViewWidth/10;
if (mTranslate>1*mViewWidth){
mTranslate=-mViewWidth;
}
matrix.setTranslate(mTranslate,0);
mLinearGradient.setLocalMatrix(matrix);
//每隔100毫秒闪动一下
postInvalidateDelayed(100);
}
}
/*
LinearGradient参数:
float x0: 渐变起始点x坐标
float y0:渐变起始点y坐标
float x1:渐变结束点x坐标
float y1:渐变结束点y坐标
int[] colors:颜色 的int 数组
float[] positions: 相对位置的颜色数组,可为null, 若为null,可为null,颜色沿渐变线均匀分布
Shader.TileMode tile: 渲染器平铺模式*/
}