自定义初学2——扩展View

倘若我们需要的功能找不到对应的系统控件了,这时我们就只能自己绘制了。首先定义一个继承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;

 }

}


然后直接在要用的布局文件中加载就行了,这里就不说了

源代码


参考:


上一篇:Fragment初学5——使用Fragment的子类PreferenceFragment


下一篇:linux 安全(一) 防火墙和SELinux机制