您的位置:首页 > 移动开发 > Android开发

Android手势(2)---多点触控基础之二

2016-04-18 11:56 507 查看
一、一些常量

常见的动作常量:

public static final int ACTION_DOWN = 0;单点触摸动作

public static final int ACTION_UP = 1;单点触摸离开动作

public static final int ACTION_MOVE = 2;触摸点移动动作

public static final int ACTION_CANCEL = 3;触摸动作取消

public static final int ACTION_OUTSIDE = 4;触摸动作超出边界

public static final int ACTION_POINTER_DOWN = 5;多点触摸动作

public static final int ACTION_POINTER_UP = 6;多点离开动作

以下是一些非touch事件

public static final int ACTION_HOVER_MOVE = 7;

public static final int ACTION_SCROLL = 8;

public static final int ACTION_HOVER_ENTER = 9;

public static final int ACTION_HOVER_EXIT = 10;

掩码常量

ACTION_MASK = 0X000000ff

动作掩码

ACTION_POINTER_INDEX_MASK = 0X0000ff00

触摸点索引掩码

ACTION_POINTER_INDEX_SHIFT = 8 获取触摸点索引需要移动的位数

二、相关方法

getAction()方法返回的是int类型,用到的只有低16位,其中:低八位是动作的类型,高8位是触摸点索引值的表示(单点为0,双点为1)

获得动作类型: int action = event.getAction() & ACTION_MASK 或者使用 getActionMasked()

获得触摸点索引类型: int pointerIndex = (event.getAction() & ACTION_POINTER_INDEX_MASK ) >> ACTION_POINTER_INDEX_SHIFT

或者使用 getActionIndex()

为什么要有索引信息?

有了索引信息,我们可以在onTOuchEvent事件中判断传进来的MotionEvent对象对应的是单点信息还是多点信息。

下面的代码段能使用户在屏幕上拖动一个对象。它记录了初始点的位置,计算点移动的距离,并将对象移动到新的位置。它正确的处理了这种情况:当第一个手指把控件拖到一个位置,然后按下第二个手指,且第二个手指与同一个控件上。当用户抬起第一个手指时,控件不会跑到第二个手指的位置同时第二个手指可以继续拖动控件。

private int mActivePointerId = INVALID_POINTER_ID;

@Override
public boolean onTouchEvent(MotionEvent ev) {
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);

final int action = MotionEventCompat.getActionMasked(ev);

switch (action) {
case MotionEvent.ACTION_DOWN: {
final int pointerIndex = MotionEventCompat.getActionIndex(ev);
final float x = MotionEventCompat.getX(ev, pointerIndex);
final float y = MotionEventCompat.getY(ev, pointerIndex);

// Remember where we started (for dragging)
mLastTouchX = x;
mLastTouchY = y;
// Save the ID of this pointer (for dragging)
mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
break;
}

case MotionEvent.ACTION_MOVE: {
// Find the index of the active pointer and fetch its position
final int pointerIndex =
MotionEventCompat.findPointerIndex(ev, mActivePointerId);

final float x = MotionEventCompat.getX(ev, pointerIndex);
final float y = MotionEventCompat.getY(ev, pointerIndex);

// Only move if the ScaleGestureDetector isn't processing a gesture.
if (!mScaleDetector.isInProgress()) {
// Calculate the distance moved
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;

mPosX += dx;
mPosY += dy;

invalidate();
}
// Remember this touch position for the next move event
mLastTouchX = x;
mLastTouchY = y;

break;
}

case MotionEvent.ACTION_UP: {
mActivePointerId = INVALID_POINTER_ID;
break;
}

case MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break;
}

case MotionEvent.ACTION_POINTER_UP: {

final int pointerIndex = MotionEventCompat.getActionIndex(ev);
final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);

if (pointerId == mActivePointerId) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = MotionEventCompat.getX(ev, newPointerIndex);
mLastTouchY = MotionEventCompat.getY(ev, newPointerIndex);
mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
}
break;
}
}
return true;
}


—————————————————————————————————————————————————–

JAVA(SSM、SSH等)20项目视频教程,共134G

下载地址:

https://item.taobao.com/item.htm?id=558680925808


———————-课程目录——————————

第01项目:OA办公自动化项目(四套)

第02项目:CRM客户关系管理项目(两套)

第03项目:宅急送项目

第04项目:杰信商贸SSH版

第05项目:电力项目(两套)

第06项目:校内网项目

第07项目:Java邮件开发教程

第08项目:java网上在线支付实战视频

第09项目:俄罗斯方块游戏开发_视频教程

第10项目:交通灯管理系统视频教程

第11项目:银行业务调度系统视频教程

第12项目:供应链系统视频教程

第13项目:网上商城项目

第14项目:药品集中采购系统视频教程

第15项目:杰信商贸SSM版

第16项目:国家税务协同平台项目

第17项目:javaWeb聊天室

第18项目:点餐系统

第19项目:网上书店

第20项目:手机进销存系统

—————————————————————————————————————————————————–
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息