知识点:
1、 Android开发中的运动事件:触摸屏(TouchScreen)和滚动球(TrackBall)
2、对运动事件的处理:MotionEvent
3、触摸时必发的三个MotionEvent动作常量:
MotionEvent.ACTION_DOWN:初次触摸时触发
MotionEvent.ACTION_UP:离开触摸时触发
MotionEvent.ACTION_MOVE:触摸移动时触发
注:一个正常的触摸事件有ACTION_DOWN开始,中间可以存在0个或几个ACTOIN_MOVE,最后以ACTION_UP结束,开始触摸-->(移动)-->停止触摸。
4、其他MotionEvent常量:
MotionEvent.ACTION_CANCEL:此事件不由用户触发,而是由系统在需要的时候触发,例如当父view打断触摸事件(onInterceptTouchEvent()返回true),从子view拿回处理事件的控制权时,就会给子view发一个ACTION_CANCEL事件,子view就再也不会收到后续事件了。
MotionEvent.ACTION_OUTSIDE:触摸超出正常UI边界时触发
MotionEvent.ACTION_SCROLL:非触摸滚动,主要由鼠标、滚轮、轨迹球触发
有多个触摸点时触发:
MotionEvent.ACTION_POINTER_DOWN:当屏幕上至少有一个点被触摸时,此事如果再新按下一个触摸点,就会触发该事件
MotionEvent.ACTION_POINTER_UP:当屏幕上至少有两个点被触摸时,松开其中的一个触摸点,该事件就会被触发
5、MotionEvent类常用的方法:
getAction():返回动作类型
getX()、getY():触摸点的相对坐标(相对于视图左上角的坐标)
getRawX()、getRawY():相对于屏幕的绝对坐标
getSize():触摸点的接触范围(指压范围)
getPressure():压力值,0-1之间,看情况,可能始终返回1,这个由驱动和物理硬件决定
getEdgeFlags():当事件类型是ActionDown时可以通过此方法获得边缘标记(EDGE_LEFT,EDGE_TOP,EDGE_RIGHT,EDGE_BOTTOM),但是看设备情况,很可能始终返回0
getDownTime():获取接触触摸点的时间
getEventTime():获取触摸事件结束的时间
getActionMasked():多点触控获取经过掩码后的动作类型
getActionIndex():多点触控获取经过掩码和平移后的索引
getPointerCount():获取触摸点的数量,比如2则可能是两个手指同时按压屏幕
getPointerId(nId):对于每个触点的细节,我们可以通过一个循环执行getPointerId方法获取索引
getX(nID)、getY(nID):获取第nID个触点的位置
getPressure(nId):获取第nID个触点的指压
拓展:getAction()和getActionMasked()的区别:
对单点触控,getAction()返回值和getActionMasked()是相同的。对多点触控,getAction()返回值和getActionMasked()返回值稍有不同。
多点触控:多点触控时因为增加了本次触摸的索引,所以改用16位二进制数,如0x0001,低8位代表动作类型信息,高8位代表触摸点的索引信息(触控点的位置信息)
例如:值为0x0000,表示是第一个触控点的ACTION_DOWN操作;值是0x0100,表示是第二个触控点的ACTION_DOWN操作;第三个ACTION_DOWN操作:0x0200。
6、设置触摸事件的方式有两种:
一是委托式:创建一个监听器:View.OnTouchListener接口,实现onTouch()方法,方法中传入MotionEvent参数和View参数
二是回调式:自定义一个View类实现实现OnTouchListener接口
代码如下:
1、java源码:
1 package com.example.movetest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.util.Log; 6 import android.view.MotionEvent; 7 import android.view.View; 8 import android.view.View.OnTouchListener; 9 import android.widget.TextView; 10 //触摸事件的处理方式二:自定义类实现OnTouchListener接口 11 public class MainActivity extends Activity{ 12 TextView textView; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 textView=(TextView)findViewById(R.id.textview); 18 //设置监听: 19 textView.setOnTouchListener(new MyView()); 20 } 21 22 //自定义类实现OnTouchListener接口 23 public class MyView implements OnTouchListener{ 24 @Override 25 public boolean onTouch(View arg0, MotionEvent arg1) { 26 //String string="X="+String.valueOf(arg1.getX())+",Y="+String.valueOf(arg1.getY()); 27 //textView.setText(string); 28 switch (arg1.getAction()) { 29 case MotionEvent.ACTION_DOWN: 30 textView.setText("ACTION_DOWN"); 31 break; 32 default: 33 break; 34 } 35 return false; 36 } 37 } 38 } 39 40 /* 41 //触摸事件处理方式一:创建OnTouchListener监听器 42 public class MainActivity extends Activity { 43 @Override 44 protected void onCreate(Bundle savedInstanceState) { 45 super.onCreate(savedInstanceState); 46 setContentView(R.layout.activity_main); 47 final TextView textView=(TextView)findViewById(R.id.textview); 48 textView.setOnTouchListener(new OnTouchListener() { 49 @Override 50 public boolean onTouch(View arg0, MotionEvent arg1) { 51 Log.d("TAG","onTouch action"+arg1.getAction()); //打印日志 52 //将textview显示的数据换成触摸点的位置坐标 53 String string="X="+String.valueOf(arg1.getX())+",Y="+String.valueOf(arg1.getY()); 54 textView.setText(string);//重置TextView文本显示 55 return false; 56 } 57 }); 58 } 59 } 60 */
2、activity_main.xml代码如下:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context="com.example.movetest.MainActivity" > 10 11 <TextView 12 android:id="@+id/textview" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:text="触摸事件" /> 16 17 </RelativeLayout>
3、AndroidManifest.xml代码:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.movetest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="18" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>