学习view拖拽功能的时候,遇到一些问题,开始没弄明白怎么实现的,现在解决了。有一个关键点,分享如下:

@Override

public void draw(Canvas canvas) {

int width=canvas.getWidth();

int height=canvas.getHeight();

canvas.drawRect(0, 0, width, height, backgroundPaint);


canvas.drawCircle(x, y, RADIUS, myPaint);

invalidate();

}

代码所示,是重写了view的draw方法,绘制view的形状。

@Override

public boolean onTouchEvent(MotionEvent event) {

int action=event.getAction();

switch(action){

case MotionEvent.ACTION_DOWN:

initialX=x;

initialY=y;

offsetX=event.getX();

offsetY=event.getY();

break;

case MotionEvent.ACTION_MOVE:

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

//捕捉移动事件,改变圆的圆心

x=initialX+event.getX()-offsetX;

y=initialY+event.getY()-offsetY;

break;

}

event.recycle();

return true;

}

这是拖拽功能的实现。但是为什么在触摸事件中只改变view圆心就可以让改变位置后的样子显示出来呢?

查阅文档后才发现,invalidate()方法很重要。我在原有代码上加上了如下一行:


@Override

public void draw(Canvas canvas) {

int width=canvas.getWidth();

int height=canvas.getHeight();

canvas.drawRect(0, 0, width, height, backgroundPaint);


canvas.drawCircle(x, y, RADIUS, myPaint);

System.out.println("调用次数:"+count++);

invalidate();

}

在后台可以看,打印出来的调用次数一直往上涨,所以我们可以发现,每次调用invalidate()方法后,就会调用draw或ondraw方法,也就是说这里的draw方法是一个无限递归。