android拖拽功能的实现原理
学习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方法是一个无限递归。
更多相关文章
- Android之Canvas
- Android之关于onSaveInstanceState和onRestoreInstanceState触发
- 移动数据流程
- android 生成快捷方式(包括源码)
- Android实现ListView数据动态加载的方法
- Android(安卓)X86 获取不到ip的解决方法
- Android(安卓)图片OutOfMemory异常bitmap size exceeds VM budge
- Android中简单的日期格式化
- AndroidStudio旧模板使用方法