`
felixour
  • 浏览: 33370 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

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

 
阅读更多

我们知道,在每一个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为手指移动后的坐标。

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

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;

 

使用switch (event.getAction() & MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。

然后我们就可以根据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();// 刷新界面

 

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

2
0
分享到:
评论

相关推荐

    android图片移动放缩demo

    本示例"android图片移动放缩demo"提供了一个基础的实现方案,通过自定义View并结合手势识别来实现这一功能。接下来,我们将详细讨论这个Demo中涉及的技术点。 1. **自定义View**: 自定义View是Android开发中的...

    手势点击图片放缩

    Android系统提供了一套GestureDetector类,用于识别常见的触摸手势,如单击、双击、滑动和缩放。对于图片的缩放,主要涉及到ScaleGestureDetector,它是专门用于识别pinch-to-zoom(捏合缩放)手势的工具类。 1. **...

    android多触点放缩图片,画廊浏览展示

    在Android开发中,实现“多触点放缩图片,画廊浏览展示”涉及到多个关键知识点。首先,我们要理解Android的触摸事件处理机制,接着是图片的加载与显示,最后是多点触控缩放和画廊浏览的实现。下面将详细讲解这些内容...

    安卓手势滑动 放缩1111

    在安卓平台上,手势滑动和放缩是移动应用开发中不可或缺的部分,它们为用户提供了一种直观、便捷的交互方式。本文将深入探讨安卓手势识别机制,包括基础的手势操作、自定义手势以及如何实现滑动和放缩效果。 首先,...

    Android-可拖动可放大缩放的ImageView

    通过阅读和理解这些代码,开发者可以更好地学习如何自定义Android UI组件,实现更复杂的交互效果。 总的来说,这个自定义的`DragZoom ImageView`是一个强大的工具,它结合了Android的触摸事件处理、Matrix变换以及...

    Android可拖动缩放的ImageView DEMO

    在Android开发中,创建一个可拖动和缩放的ImageView是一项常见的需求,特别是在设计交互式应用或游戏时。本文将详细讲解如何实现这样一个功能,主要关注`onTouchListener`的使用和`ImageView`的`scaleType`属性。 ...

Global site tag (gtag.js) - Google Analytics