android触屏手势识别全解析
16lz
2021-01-23
android中使用触屏触控技术和手势识别技术,有许多细节问题,这里整理一下,供大家参考。package com.ethan.touch;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;
import android.widget.Toast;
/**
* 测试触摸和手势
*
* @author ethan 实现了触控监听和手势监听
*/
public class TouchGestureActivity extends Activity implements OnTouchListener,
OnGestureListener {
private static final String tag = "TouchGestureActivity";
public GestureDetector mGestureDetector;
TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 初始化手势识别对象,有时候很容易忘记,就会报空指针异常
mGestureDetector = new GestureDetector( this);
textView = (TextView) this.findViewById(R.id.textView);
textView.setOnTouchListener( this);
textView.setLongClickable( true); // 不设置这行,onFling可能监听不到
}
/*
* 触摸事件监听(这里既然用了手势,就需要将触摸事件的event传递给手势的监听)
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
// OnGestureListener will analyzes the given motion event
return mGestureDetector.onTouchEvent(event);
}
/*
* 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
*/
@Override
public boolean onDown(MotionEvent e) {
Log.i(tag, "onDown!");
return false;
}
/*
* 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i(tag, "onFling!");
// 参数解释:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒
// 触发条件 :
// X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
int FLING_MIN_DISTANCE = 100;
int FLING_MIN_VELOCITY = 200;
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE
&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling left
Toast.makeText( this, "Fling Left", Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE
&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling right
Toast.makeText( this, "Fling Right", Toast.LENGTH_SHORT).show();
}
return false;
}
/*
* 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
*/
@Override
public void onLongPress(MotionEvent e) {
Log.i(tag, "onLongPress!");
}
/*
* 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
Log.i(tag, "onScroll!");
//参数和onFling里面差不多
return false;
}
/*
* 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
* 注意和onDown()的区别,强调的是没有松开或者拖动的状态
*/
@Override
public void onShowPress(MotionEvent e) {
Log.i(tag, "onShowPress!");
}
/*
* 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i(tag, "onSingleTapUp!");
return false;
}
}
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;
import android.widget.Toast;
/**
* 测试触摸和手势
*
* @author ethan 实现了触控监听和手势监听
*/
public class TouchGestureActivity extends Activity implements OnTouchListener,
OnGestureListener {
private static final String tag = "TouchGestureActivity";
public GestureDetector mGestureDetector;
TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 初始化手势识别对象,有时候很容易忘记,就会报空指针异常
mGestureDetector = new GestureDetector( this);
textView = (TextView) this.findViewById(R.id.textView);
textView.setOnTouchListener( this);
textView.setLongClickable( true); // 不设置这行,onFling可能监听不到
}
/*
* 触摸事件监听(这里既然用了手势,就需要将触摸事件的event传递给手势的监听)
*/
@Override
public boolean onTouch(View v, MotionEvent event) {
// OnGestureListener will analyzes the given motion event
return mGestureDetector.onTouchEvent(event);
}
/*
* 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
*/
@Override
public boolean onDown(MotionEvent e) {
Log.i(tag, "onDown!");
return false;
}
/*
* 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i(tag, "onFling!");
// 参数解释:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒
// 触发条件 :
// X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
int FLING_MIN_DISTANCE = 100;
int FLING_MIN_VELOCITY = 200;
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE
&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling left
Toast.makeText( this, "Fling Left", Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE
&& Math.abs(velocityX) > FLING_MIN_VELOCITY) {
// Fling right
Toast.makeText( this, "Fling Right", Toast.LENGTH_SHORT).show();
}
return false;
}
/*
* 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
*/
@Override
public void onLongPress(MotionEvent e) {
Log.i(tag, "onLongPress!");
}
/*
* 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
Log.i(tag, "onScroll!");
//参数和onFling里面差不多
return false;
}
/*
* 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
* 注意和onDown()的区别,强调的是没有松开或者拖动的状态
*/
@Override
public void onShowPress(MotionEvent e) {
Log.i(tag, "onShowPress!");
}
/*
* 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i(tag, "onSingleTapUp!");
return false;
}
}
更多相关文章
- android 登陆、注册、并个指定用户充值
- GestureDetector.OnGestureListener 详解以及android手势动作详
- Android的滑动手势处理
- Android用户看过来,免ROOT和顽固后台拜拜
- Android 存储用户信息
- android多框架实现短视频应用、3D手势旋转、banner控件、指南针
- Android中的手势识别
- 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContex
- Android GestureDetector手势识别与多点触控探究