控件的高级属性(一)

手势检测
  • 当用户触摸屏幕的时候,会产生很多的手势,如up,down,scroll, fling等

  • 处理简单的手势:

    • View类有一个View.onTouchLiatener内部接口,通过重写他的onTouch(View view, MotionEvent event)函数,可以处理一些touch事件,但是这个函数只限于处理简单手势
  • 处理复杂手势:

    • Android SDK提供给我们一些GestureDetector(手势检测)类
    • GestureDetector对外提供两个接口OnGestureListener和OnDoubleTapListener 和一个外部类SimpleOnGestureListener(其实是上面的两个接口的所有函数的集成,它包含这两个接口中的所有函数,而且都已经被重写,但是所有的函数体都是空的,同时该类是一个静态类)
GestureDetector.OnGestureListener接口
  • 基本讲解:
    • 如果我们写一个类并继承自OnGestureListener,则会提示有几个必须重写的函数
public class gestureListener implements GestureDetector.OnGestureListener{
    //用户按下屏幕就会触发的函数
    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    //如果按下的时间超过瞬时,而且在按下的时候没有松开或者是拖动的,该函数就会触发
    @Override
    public void onShowPress(MotionEvent e) {


    }

    //一次单独的轻击抬起操作,轻击以下屏幕立即抬起来就会触发这个函数
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }


    //在屏幕上拖动事件,无论是使用手指进行拖动还是以抛的动作进行滚动,都会多次出发这个函数,在ACTION_MOVE动作发生的时候就会触发该函数
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }

    //长按触摸屏,超过一定的时长,就会触发这个函数
    @Override
    public void onLongPress(MotionEvent e) {


    }


    //滑屏,用户按下触摸屏,快速移动后松开,有一个MotionEvent ACTION_DOWN、多个ACTION_MOVE、一个ACTION_UP触发
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        return false;
    }
}
  • 触发的顺序:

    • onDown()->onShowPress()->onLongPress()
  • 单击一下非常快的(不滑动)Touchup,触发顺序:

    • onDown()->onSingleTapUp()->onSingleTapConfirmed()
  • 单击一下稍微慢点的(不滑动)Touchup,触发顺序为:

    • onDown()->onShowPress()->onSingleTapUp()->onSingleTapConfirmed()
  • 无论是如何滑动,只是中间的onScroll()的个数不同而已,最终都会触发onFling()

  • 滑屏,即手指触动屏幕后,稍微滑动后立即松开,触发顺序为

    • onDown()->onScroll()->onScroll()->onScroll()->…->onFling()
  • 拖动触发顺序

    • onDown()->onScroll()->onScroll()->onFling()
使用GestureDetector
  • 创建OnGestureListener()监听函数
GestureDetecror.OnGestureListener listener = new GestureDetector.OnGestureListener(){
};

private class gestureListener implements GestureDetector.OnGestureListener{
}
  • 创建GestureDetector实例mGestureDetector
GestureDetector gestureDetector = new GestureDetector(GestureDetector.OnGestureListener listener);

GestureDetector gestureDetector = new GestureDetector(Context context, GestureDetector.OnGestureListener listener);

GestureDetector gestureDetector = new GestureDetector(Context context , GestureDetector.SimpleOnGestureListener listener)
  • 在OnTouch()中进行拦截:
public boolean onTouch(View v, MotionEvent event){
    return mGEstureDetector.OnTouchEvent(event);
}
  • 绑定控件:
TextView textView = (TextView)findViewById(R.id.tv);
textView.setOnTouchListener(this);

eg:


public class GEstureDetectorTestActivity extends Activity implements View.OnTouchListener {


    private TextView textView;
    private GestureDetector gestureDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gesture_detector_test);
        gestureDetector = new GestureDetector(new gestureListener());
        textView = (TextView)findViewById(R.id.tv_gesture);
        textView.setOnTouchListener(GEstureDetectorTestActivity.this);
        textView.setFocusable(true);
        textView.setClickable(true);
        textView.setLongClickable(true);
    }


    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }


    private class gestureListener implements GestureDetector.OnGestureListener{


        @Override
        public boolean onDown(MotionEvent e) {
            System.out.println("onDown");
            return true;
        }


        @Override
        public void onShowPress(MotionEvent e) {
            System.out.println("onShowPress");
        }


        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            System.out.println("onSingleTapUp");
            return true;
        }


        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            System.out.println("onScroll");
            return true;
        }


        @Override
        public void onLongPress(MotionEvent e) {
            System.out.println("onLongPress");
        }


        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            System.out.println("onFling");
            return true;
        }
    }
}
GestureDetector.OnDoubleTapListener接口
  • 构建:
    • 方法一:新建一个测试类,同时派生自OnGestureListener和OnDoubleTapListener
private class gestureListener im[lements GestureDetector.OnGestureListener, GestureDetecor.OnDoubleTapListener{
}
  • 方法二:使用GestureDetector.setOnDoubleTapListener()函数设置双击监听
gestureDetector = new GestureDetector(new gestureListener());
private class gestureListener implements GestureDetector.OnGestureListener{
}
//设置双击监听
gestureDetector.setOnDoubleTapListener(new doubleTapListener());
private class doubleTapListener implements GestureDetector.OnDoubleTapListener{
}
OnDoubleTapListener()函数讲解:
//单击事件,用来判定该次单击是singleTap,而不是doubleTap,如果连续单击两次,就是doubleTap, 如果只进行单击一次,系统等待一段时间,如果没有第二次单击,那么就会判定为SingleTap而不是DoubleTap, 然后触发SingleTapConfirmed事件,触发顺序是onDown()->onSingleTapUp()->onSingleTapConfirmed()。
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    return false;
}

//双击事件
@Override
public boolean onDoubleTap(MotionEvent e) {
    return false;
}

//双击间隔中发生的动作,指在触发onDoubleTap以后,在双击之间发生的其他动作,包含down、up、move事件
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
    return false;
}

eg:

    private TextView textView;
    private GestureDetector gestureDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gesture_detector_test);
        gestureDetector = new GestureDetector(new gestureListener());
        gestureDetector.setOnDoubleTapListener(new doubleTapListener());
        textView = (TextView)findViewById(R.id.tv_gesture);
        textView.setOnTouchListener(GEstureDetectorTestActivity.this);
        textView.setFocusable(true);
        textView.setClickable(true);
        textView.setLongClickable(true);
    }


    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }


    private class gestureListener implements GestureDetector.OnGestureListener{


        @Override
        public boolean onDown(MotionEvent e) {
            System.out.println("onDown");
            return true;
        }


        @Override
        public void onShowPress(MotionEvent e) {
            System.out.println("onShowPress");
        }


        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            System.out.println("onSingleTapUp");
            return true;
        }


        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            System.out.println("onScroll");
            return true;
        }


        @Override
        public void onLongPress(MotionEvent e) {
            System.out.println("onLongPress");
        }


        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            System.out.println("onFling");
            return true;
        }
    }
    private class doubleTapListener implements GestureDetector.OnDoubleTapListener{


        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            System.out.println("onSimgleTapConfirmed");
            return true;
        }


        @Override
        public boolean onDoubleTap(MotionEvent e) {
            System.out.println("onDoubleTap");
            return true;
        }


        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            //结果0表示ACTION_DOWN, 1表示ACTION_UP, 2表示ACTION_MOVE
            System.out.println("onDoubleTapEvent" + e.getAction());
            return true;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjxbless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值