已经很久没有写东西了,懒惰真是勤奋的情敌,而且比勤奋长得帅一百倍,帅的灰飞烟灭。
今天写点手势监听的东西,手势监听其实在项目中也用过不少,但是每次写,基本都是百度上copy一下完事。今天忽然热情澎湃的想把这个事件简单的写一写,并且我百分之一的保证,以后每天会写点东西。
手势监听触摸的事件是在onTouchEvent()里面做的,这个方法我也没看源码,所以具体在讲些我也不太清楚。今天要写的是自定义的手势监听。
先上两张效果图,第一张是手指在屏幕上从左往右滑动,第二张是手指在屏幕上从右往左滑动。好尴尬,图上传不了。
自定义手势监听要用到一个类叫GestureDetector 。
package cn.com.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Display; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.WindowManager; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private GestureDetector gestureDetector;//触摸手势监听事件 int ScreenWidth;//获取屏幕的宽高,可以自定义手势在屏幕上滑动的距离 int ScreenHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getScreenWidthAndHeight(); gestureDetector = new GestureDetector(new GestureDetector.OnGestureListener() { @Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { //在滑动的方法里,进行手势滑动事件的判断 //e1代表手指按在屏幕上的X轴坐标点,e2代表手指离开屏幕上的X轴坐标点。 if(e1.getX() - e2.getX() < 0 && Math.abs((int)(e1.getX() - e2.getX())) > 30){ //向右滑动的判断,如果手指从左向右滑动,就走这个方法 moveRight(); return true; }else if(e1.getX() - e2.getX() > 0 && Math.abs((int)(e1.getX() - e2.getX())) > 30){ //向左滑动的判断,如果手指从右向左滑动,就走这个方法 moveLeft(); return true; }else{ return false; } } }); } /** * 向左滑动的手势 */ private void moveLeft() { Toast.makeText(this,"向左滑动手势处理事件方法",Toast.LENGTH_SHORT).show(); } /** * 向右滑动的手势 */ private void moveRight() { Toast.makeText(this,"向右滑动手势处理事件方法",Toast.LENGTH_SHORT).show(); } /** * 获取屏幕的宽高 */ private void getScreenWidthAndHeight() { WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); ScreenWidth = display.getWidth(); ScreenHeight = display.getHeight(); } //首先有一个触摸监听事件 @Override public boolean onTouchEvent(MotionEvent event) { //触摸监听事件被拦截,然后调用自定义的手势事件 return gestureDetector.onTouchEvent(event); } }
下面对代码做个简单的介绍,免得时间长了会遗忘。
第一点:onTouchEvent()方法,这个方法在手指触摸屏幕的时候会被调用,当调用这个方法的时候,拦截系统的触摸事件,返回自定义的手势处理方法。
第二点:GestureDetector.OnGestureListener()监听事件中的boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)。该方法是手指在屏幕上飞快的滑动的时候调用的方法。其中e1代表手指按在屏幕上的X轴坐标点,e2代表手指离开屏幕时X轴坐标点。e2.getX() - e1.getX()的距离代表手指在屏幕上滑动的距离。根据e1和e2来判断手指在屏幕上的手势事件,进行相应的事件处理。