倘若我们需要的功能找不到对应的系统控件了,这时我们就只能自己绘制了。首先定义一个继承View的基类,然后重写View类的一个或多个方法。
通常可以被重写的方法有这些:
onFinishInflate(): 这是一个回调方法,当应用从XML布局文件中加载组件时,该方法将被调用。
onMeasure(int,int): 该方法用来检测View组件及他所包含的所有子组件的大小。
onLayout(boolean, int, int, int, int): 当该组件分配其子组件的位置、大小时,就会被调用。
onSizeChanged(int, int, int, int): 当该组件的大小被改变时回调该方法。
onDraw(android.graphics.Canvas): 当该组件将要绘制他的内容时回调该方法。
onKeyDown(int, android.view.KeyEvent): 当某个键被按下时触发该方法。
onKeyUp(int, android.view.KeyEvent): 当某个键被松开时触发该方法。
onTrackballEvent(android.view.MotionEvent): 当发生轨迹球事件时触发该方法。
onTouchEvent(android.view.MotionEvent): 当发生触摸屏事件时触发该方法。
onFocusChanged(boolean, int, android.graphics.Rect): 当该组件得到、失去焦点时触发该方法。
onWindowFocusChanged(boolean): 当包含该组件的窗口得到、失去焦点时触发该方法。
onAttachedToWindow(): 当把该组件放入某个窗口时触发该方法。
onDetachedFromWindow():当把该组件从某个窗口分离时触发该方法。
onWindowVisibilityChanged(int): 当包含该组件的窗口的可见性发生改变时触发该方法。
当然我们并不需要重写所有的方法,而是根据功能需求写相关的方法就可以了。
下面是一个重写了onDraw方法的view,我们做一个能跟随手指移动的小球,上代码
CustomView.java
public class CustomView extends View {
public float currentX ;
public float currentY ;
// 画笔
Paint mPaint;
public CustomView(Context context) {
super(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
private void initPaint(){
//画笔初始化
mPaint=new Paint();
//设置抗锯齿
mPaint.setAntiAlias(true);
// 设置画笔的颜色
mPaint.setColor(Color.RED);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 绘制一个小圆(作为小球)
canvas.drawCircle(currentX, currentY, 15, mPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 当前组件的currentX、currentY两个属性
this.currentX = event.getX();
this.currentY = event.getY();
// 通知该组件重绘
this.invalidate();
// 返回true表明处理方法已经处理该事件
return true;
}
}
然后直接在要用的布局文件中加载就行了,这里就不说了
源代码