[Android分享] 使用触摸手势(四)

本文详细介绍了如何在Android应用中处理多点触摸手势,包括跟踪触摸事件、获取MotionEvent的Action以及如何根据触摸点的ID进行操作。通过实例代码展示了如何使用MotionEvent的getActionMasked和findPointerIndex方法来实现多点触摸手势的处理。
原文链接:http://developer.android.com/training/gestures/multi.html

处理多点触摸手势

跟踪多点触摸

当多点同时触摸屏幕时,系统将会产生如下的触摸事件:

1.ACTION_DOWN:触摸屏幕的第一个点。此时手势开始。该点的数据通常在MotionEvent事件队列索引位置0处。
2.ACTION_POINTER_DOWN:除了第一个点的其他触摸点数据。该点的数据的索引位置由getActionIndex()方法返回。
3.ACTION_MOVE:在手势过程中发生的一次变化。
4.ACTION_POINTER_UP:当不是第一个点的其他点UP后触发。
5.ACTION_UP:当手势中的最后一个点离开屏幕。

通过每个触摸点的index和ID来跟踪MotionEvent中每个触摸点的信息:

Index:一个MotionEvent将每个触摸点的信息有效的存储在一个数组中。每个触摸点的Index就是它在该数组中的位置。你使用的MotionEvent中的大多数方法将index作为一个参数,而不是触摸点的ID。

ID:每一个触摸点在触摸事件中保持一个映射的ID,在整个多点手势中来追踪某一个触摸点的事件。

每一个触摸点在一个MotionEvent的数组中出现的序列是不确定的。因此一个触摸点的index有可能从一个event到另一个event发生变化,但一个触摸点的ID在这个点的存活期间是保持不变的。使用getPointerId()方法来获得一个触摸点的ID,并在整个手势中跟踪一个点。在连续的运动事件中,使用findPointerIndex()方法来根据特定触摸点的ID获取该点的index。

?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
private int mActivePointerId;
  
public boolean onTouchEvent(MotionEvent event) {
    ....
    // Get the pointer ID
    mActivePointerId = event.getPointerId( 0 );
 
    // ... Many touch events later...
 
    // Use the pointer ID to find the index of the active pointer
    // and fetch its position
    int pointerIndex = event.findPointerIndex(mActivePointerId);
    // Get the pointer's current position
    float x = event.getX(pointerIndex);
    float y = event.getY(pointerIndex);
}


获取MotionEvent的Action

应该始终使用getActionMasked()来获取一个MotionEvent的action。与旧版的getAction方法不同,getActionMask方法被设计用来在多点触摸的情况下工作。它包括该次事件的action,但并不包括触摸点的index。能使用getActionIndex()返回与该action关联点的index。
?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int action = MotionEventCompat.getActionMasked(event);
// Get the index of the pointer associated with the action.
int index = MotionEventCompat.getActionIndex(event);
int xPos = - 1 ;
int yPos = - 1 ;
 
Log.d(DEBUG_TAG, "The action is " + actionToString(action));
             
if (event.getPointerCount() > 1 ) {
    Log.d(DEBUG_TAG, "Multitouch event" );
    // The coordinates of the current screen contact, relative to
    // the responding View or Activity.  
    xPos = ( int )MotionEventCompat.getX(event, index);
    yPos = ( int )MotionEventCompat.getY(event, index);
 
} else {
    // Single touch event
    Log.d(DEBUG_TAG, "Single touch event" );
    xPos = ( int )MotionEventCompat.getX(event, index);
    yPos = ( int )MotionEventCompat.getY(event, index);
}
...
 
// Given an action int, returns a string description
public static String actionToString( int action) {
    switch (action) {
                 
         case MotionEvent.ACTION_DOWN: return "Down" ;
         case MotionEvent.ACTION_MOVE: return "Move" ;
         case MotionEvent.ACTION_POINTER_DOWN: return "Pointer Down" ;
         case MotionEvent.ACTION_UP: return "Up" ;
         case MotionEvent.ACTION_POINTER_UP: return "Pointer Up" ;
         case MotionEvent.ACTION_OUTSIDE: return "Outside" ;
         case MotionEvent.ACTION_CANCEL: return "Cancel" ;
    }
    return "" ;
}
这个是完整源码 python实现 Django 【python毕业设计】基于Python的天气预报(天气预测分析)(Django+sklearn机器学习+selenium爬虫)可视化系统.zip 源码+论文+sql脚本 完整版 数据库是mysql 本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后,将其存储在后端数据库中,以供后续分析。 其次,采用s,将其存储在后端数据库中,以供后续分析。 其次,采用sklearn机器学习库构建预测模型,通过时间序列分析和回归方法,对未来天气情况进行预测。我们利用以往的数据训练模型,以提高预测的准确性。通过交叉验证和超参数优化等技术手段,我们优化了模型性能,确保其在实际应用中的有效性和可靠性。 最后,基于Django框架开发前端展示系统,实现天气预报的可视化。用户可以通过友好的界面查询实时天气信息和未来几天内的天气预测。系统还提供多种图表类型,包括折线图和柱状图,帮助用户直观理解天气变化趋势。 本研究的成果为天气预报领域提供了一种新的技术解决方案,不仅增强了数据获取和处理的效率,还提升了用户体验。未来,该系统能够扩展至其他气象相关的应用场景,为大众提供更加准确和及时的气象服务。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值