学习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方法是一个无限递归。


更多相关文章

  1. Android之Canvas
  2. Android之关于onSaveInstanceState和onRestoreInstanceState触发
  3. 移动数据流程
  4. android 生成快捷方式(包括源码)
  5. Android实现ListView数据动态加载的方法
  6. Android(安卓)X86 获取不到ip的解决方法
  7. Android(安卓)图片OutOfMemory异常bitmap size exceeds VM budge
  8. Android中简单的日期格式化
  9. AndroidStudio旧模板使用方法

随机推荐

  1. 如何为香蕉派 banana pi BPI-M2编译Andro
  2. [android]Activity切换动画
  3. Android(安卓)编程设置 APN
  4. windows下载android源代码
  5. Android(安卓)入门 和 环境搭建
  6. android布局学习利器-Hierarchy Viewer
  7. Android(安卓)UI开发第二篇——多级列表(E
  8. Android中/system/build.prop文件解读
  9. Android进程内存上限
  10. Android开发之ConstraintLayout布局