`
felixour
  • 浏览: 32903 次
  • 性别: 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_view_MotionEvent.rar_float

    这个压缩包文件`android_view_MotionEvent.rar_float`的焦点在于`float`类型的数据,这通常涉及到Android中的坐标和压力等触摸事件的参数。在Android应用开发中,理解和掌握`MotionEvent`的用法对于创建与用户交互的...

    android图片移动放缩demo

    通过阅读和理解这部分代码,开发者可以学习到如何在Android中实现图片的移动和放缩,以及如何结合手势识别进行交互设计。对于初学者,这是一个很好的实践案例,有助于提升对Android图形和触摸事件处理的理解。

    android中的MotionEvent 及其它事件处理

    ndroid中的MotionEvent 及其它事件处理

    Android MotionEvent 坐标获取

    Android MotionEvent中getX()与getRawX()都是获取屏幕坐标(横),但二者又有区别 getX() : 是获取相对当前控件(View)的坐标 getRawX() : 是获取相对显示屏幕左上角的坐标

    Android触屏事件和MotionEvent详解

    Android 触屏事件和 MotionEvent 详解 Android 触屏事件是指用户在设备屏幕上的所有操作,包括手指按到屏幕上、手指在屏幕上移动和手指离开屏幕等。触屏事件是 Android 设备交互的主要媒介,屏幕分为触屏和非触屏两...

    手势点击图片放缩

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

    MotionEvent

    总之,MotionEvent和OnTouchListener是Android触摸事件处理的基础,它们使得开发者能够构建出响应用户各种手势的交互式应用。了解并熟练运用这两个组件,对于提升Android应用的用户体验至关重要。在实际项目中,你...

    View的onInterceptTouchEvent(MotionEvent ev)和dispatchTouchEvent(MotionEvent ev) 解析

    当用户触摸屏幕时,Android会生成一个MotionEvent序列,这个序列包含了触摸事件的开始、移动、结束等状态。默认情况下,触摸事件会直接传递给被点击的子View。但是,有时候我们可能希望父View能捕获这些事件,例如在...

    android 游戏飞机移动模拟

    首先,我们需要理解Android的UI体系,它基于View和 ViewGroup。在我们的案例中,飞机可以被设计为一个自定义的View类,例如`PlaneView`,继承自`View`。在这个自定义类中,我们可以绘制飞机的图像,并设置其初始位置...

    Android 自定义View 跟随手指移动的正方形 移动范围不超过屏幕

    在Android开发中,自定义View是一项非常重要的技能,它允许开发者根据自己的需求...自定义View的学习是一个不断实践和优化的过程,通过这样的项目,你可以深入理解Android图形绘制和事件处理机制,提升你的开发能力。

    Android 矩形在屏幕内的上下左右移动

    总的来说,"Android 矩形在屏幕内的上下左右移动"这个项目涵盖了Android基础的视图系统、绘图API、事件处理和自定义View等重要知识点,是学习Android开发的好起点。通过这个项目,开发者可以深入理解Android应用如何...

    android 两点缩放/移动图片DEMO

    通过这个DEMO,开发者可以学习到如何在Android平台上实现高效的图像交互功能,为用户带来更加直观和丰富的体验。无论是开发图片查看器、地图应用,还是其他需要多点触控操作的场景,这些知识都极具价值。

    MotionEvent的Demo

    总之,MotionEvent是Android开发中的重要工具,它允许开发者捕获和处理用户的触摸输入,实现各种交互效果。通过实践和学习MotionEventDemo,开发者可以提升自己在处理用户手势方面的技能,从而创建出更加用户友好的...

    Android下图片移动的demo

    Android的`MotionEvent`类提供了触摸事件的相关信息,如ACTION_DOWN(手指按下)、ACTION_MOVE(手指移动)和ACTION_UP(手指抬起)。在`View`的`onTouchEvent()`方法中,开发者可以监听这些事件,根据用户的触摸...

    android view随手指移动

    这个"android view随手指移动"的实现涉及到Android的触摸事件处理和视图动画技术。接下来,我们将深入探讨如何在Android中实现这一功能。 首先,我们需要了解Android中的触摸事件处理机制。在Android中,触摸事件...

    android 物体移动demo

    在Android开发中,物体移动是实现游戏或动态应用的核心功能之一。这个"android 物体移动demo"提供了关于如何在Android平台上...通过学习和实践这个demo,开发者可以更好地理解和掌握Android平台上实现物体移动的技巧。

    android 图片,按钮移动

    Android通过`MotionEvent`类来处理用户的触摸操作,包括ACTION_DOWN(手指按下)、ACTION_MOVE(手指移动)和ACTION_UP(手指抬起)等动作。开发者可以在Activity或View中重写`onTouchEvent`方法来监听这些事件。 1...

    Android 可拖拽移动的RecyclerView

    总之,通过结合RecyclerView、ItemTouchHelper和自定义Adapter,我们可以轻松实现Android应用中的可拖拽移动列表。这个功能增强了用户的交互体验,使得数据排序变得更加直观和便捷。在实际开发中,根据项目需求,你...

    android 跟随手指移动的小球

    在Android开发中,创建一个能够跟随手指移动的小球是一个经典的交互式UI设计示例,它可以帮助初学者理解触摸事件处理、绘图以及Android图形系统的基本原理。以下将详细阐述实现这个功能所需的知识点: 1. **Android...

Global site tag (gtag.js) - Google Analytics