zoukankan      html  css  js  c++  java
  • Android学习之触点事件的处理

    知识点:

    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>
  • 相关阅读:
    C# 获取存储过程 返回的参数Output
    Blog数据库设计之Tags表设计
    FLASH 加载进度 JS代码
    Asp.net清除数据缓存及页面缓存
    access数据库用sql语句添加字段,修改字段,删除字段,类型转换
    获取资源文件
    C# 如何获取当前项目运行路径的父目录?
    深入理解 __doPostBack
    LookUpEdit How update binding source immediately after selection?
    C#动态加载DLL
  • 原文地址:https://www.cnblogs.com/hh8888-log/p/9765847.html
Copyright © 2011-2022 走看看