activity 手势识别器 GestureDetector

    xiaoxiao2025-02-09  17

    手势识别器是个三年前用到的比较多的知识点,尤其是在ViewPager出来之前。 主要功能点有仿Ios横滑跳转页面,到下一页面。现在简单说说GestureDetector。 public GestureDetector(Context context, OnGestureListener listener, Handler handler)最终都是调用这个方法生成对象,它内部有两个接口类 OnGestureListener 和OnDoubleTapListener,看名字可以知道是一个手指和两个手指。有个SimpleOnGestureListener实现了 OnGestureListener ,这样如果调用GestureDetector构造时,不用把OnGestureListener 每个方法都重写,调用SimpleOnGestureListener就可以了,只需重写需要的方法即可。 onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) :滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发      onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY):在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法   这两个方法用的会比较多点。比如上面所说的左右滑动跳转页面,就需要识别左滑还是右滑,boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY)   解释:      e1:第1个ACTION_DOWN MotionEvent      e2:最后一个ACTION_MOVE MotionEvent      velocityX:X轴上的移动速度,像素/秒      velocityY:Y轴上的移动速度,像素/秒   根据velocityX的绝对值的大小来判断本次滑动是否合法,达到可以切换页面的标准。 e2.getRawX()-e1.getRawX()如果大于某个值,比如200,页面往左滑, e1.getRawX()-e2.getRawX() 如果大于某个值,比如200,页面往右滑, 可以在里面执行页面Intent跳转页面的逻辑。 activity页面被触摸,会先执行dispatchTouchEvent()方法, public boolean dispatchTouchEvent(MotionEvent ev) {         if (ev.getAction() == MotionEvent.ACTION_DOWN) {             onUserInteraction();         }         if (getWindow().superDispatchTouchEvent(ev)) {             return true;         }         return onTouchEvent(ev);     } 最终如果没被布局layout里面的控件消费,最终执行onTouchEvent(ev)方法,重点来了,让手势识别器 生效的方法是 mGestureDetector.onTouchEvent(event);所以需要在activity的 onTouchEvent()方法里面调用mGestureDetector.onTouchEvent(event);至于为什么不在dispatchTouchEvent()中调用,是因为避免和控件产生冲突,正常情况下,点击触摸事件以控件为主,防止干扰。另类的需求当我没说。 手势滑动的几个页面,可以抽取一个父类,统一处理逻辑,对外抽象接口 abstract class BaseSetupActivity extends Activity { protected static final String TAG = "BaseSetupActivity"; public SharedPreferences sp; //1.声明一个手势识别器 private GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sp = getSharedPreferences("config", MODE_PRIVATE); //2.初始化手势识别器 //Basic Default Base Simple mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){ /**划屏对应的方法. * e1 手指第一次触摸屏幕 * e2 手指离开屏幕瞬间 * velocityX 水平方向移动的速度 px/s * velocityY 竖直方向移动的速度 */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if(Math.abs(velocityX)<100){ Log.i(TAG,"移动的太慢,动作不合法"); return true; } if((e2.getRawX()-e1.getRawX()) >200){ showPre(null); return true; } if((e1.getRawX()-e2.getRawX()) >200){ showNext(null); return true; } return super.onFling(e1, e2, velocityX, velocityY); } }); //在父类里面加载 布局 initView(); } //3.activity被触摸的时候调用的方法 , 需要在这个里面让手势识别器 生效 @Override public boolean onTouchEvent(MotionEvent event) { //让手势识别器 生效 mGestureDetector.onTouchEvent(event); return super.onTouchEvent(event); } /** * 初始化 当前activity的view 设置布局 查找view对象 */ public abstract void initView(); /** * 显示下一个界面 */ public abstract void showNext(View view); /** * 显示上一个界面 */ public abstract void showPre(View view); } 其他activity集成该类就行,页面跳转在showNext(View view)和showPre(View view)里面执行,初始化布局在initView()转换布局。
    转载请注明原文地址: https://ju.6miu.com/read-1296263.html
    最新回复(0)