分享

Android学习之基于MotionEvent的移动和放缩

 昵称3554661 2015-02-26

     我们知道,在每一个View里有一个onTouchEvent的方法可以重写,这个方法的作用就是能够监控你的手在屏幕上按下、移动、抬起的动作。
这个方法提供了一个参数,就是一个MotionEvent对象,我们获取到event对象以后,就要对其行为进行判断,一般使用switch如下:

public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
    break;
  case MotionEvent.ACTION_UP:
    break;
  }
  return true;
}

今天我们介绍的主要是两种操作:五子棋盘的移动和放大缩小。

那么首先我们要画一个五子棋,在View的onDraw方法里,我们直接画线条,这里我们就不多说了:

@Override
protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  // 画棋盘
  paint.setColor(Color.BLACK);
  for (int i = 0; i < GobangConfig.num; i++) {
    canvas.drawLine(GobangConfig.X, GobangConfig.Y + i
        * GobangConfig.size, GobangConfig.X
        + (GobangConfig.num - 1) * GobangConfig.size,
        GobangConfig.Y + i * GobangConfig.size, paint);
    canvas.drawLine(
        GobangConfig.X + i * GobangConfig.size,
        GobangConfig.Y,
        GobangConfig.X + i * GobangConfig.size,
        GobangConfig.Y + (GobangConfig.num - 1) * GobangConfig.size,
        paint);
  }
}

我们今天要做的有两件事情:
1、棋盘的移动
棋盘的移动我们要用到MotionEvent里的两个常量:ACtION_DOWN和ACTION_MOVE

private float x1, y1, x2, y2;

x1,y1为手指刚刚触摸到屏幕的坐标。
x2,y2为手指移动后的坐标。

于是我们利用这两个常量和坐标来写棋盘的移动:

case MotionEvent.ACTION_DOWN:
  //获取触碰的坐标
  x1 = event.getX();
  y1 = event.getY();
  break;
case MotionEvent.ACTION_MOVE:
  //获取移动后的坐标
  x2 = event.getX();
  y2 = event.getY();
  //改变棋盘的位置
  GobangConfig.X += (x2 - x1);
  GobangConfig.Y += (y2 - y1);
  //将新坐标赋给原来触碰的坐标
  x1 = x2;
  y1 = y2;
  break;

这样就实现了棋盘的移动,然后我们要做的是:

2、棋盘的放大和缩小

我们这里演示的放大和缩小是按照固定比例的,有兴趣的可以根据你两个手指所拉伸的长度来进行放大和缩小。
思路是这样的,我们先在屏幕上按住一个手指,那么,当我们按下第二个手指时,会有一个初始距离,然后我们移动第二个手指并松开,在松开瞬间得到两个手指的新距离,比较初始距离和新距离,来确定是放大还是缩小。
首先定义一个量来储存初始距离:

private float oldPath;

然后我们就可以根据MotionEvent的常量来进行相应的操作:

case MotionEvent.ACTION_POINTER_DOWN:
  float mx = event.getX(1);//参数1代表是第二个手指
  float my = event.getY(1);
  oldPath = (float) Math.sqrt((mx - x1) * (mx - x1) + (my - y1) * (my - y1));// 得到初始距离
  break;
case MotionEvent.ACTION_POINTER_UP:
  x = event.getX(0);// 参数0代表第一个按下的手指
  y = event.getY(0);
  mx = event.getX(1);//参数1代表第二个按下的手指
  my = event.getY(1);
  float newPath = (float) Math.sqrt((mx - x1) * (mx - x1) + (my - y1) * (my - y1));// 计算得到新距离
  if (oldPath < newPath)// 判断新距离和旧距离
    GobangConfig.size = (int) (GobangConfig.size * 1.1);// 放大棋盘
  else if (GobangConfig.size > 15)// 棋盘不能过小,否则就无法放大
      GobangConfig.size = (int) (GobangConfig.size * 0.9);// 所小棋盘
  break;

注意,在这个switch选择以后,一定要加一个:

this.invalidate();// 刷新界面

这样就可以实现我们所需要的效果啦,大家如果还有好的想法可以多交流哦!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多