疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Activity 双击事件监听(解决事件派发问题)


 

        使用手势识别类GestureDetector可以用标准的SDK类实现双击监听,但存在一个局限性:由于GD是在OnTouchEvent方法中拦截事件进行处理,而Android事件派发流程,使得如果Activity内部的View会消耗点击事件,GD就无法接受到点击事件了。

  为此,本文实现一个可以完美监听Activity事件的工具类:DoubleClick.

  类的全部源码:

  [java]

  public class DoubleClick{

  private int clickCount;

  private long firstClickTime;

  private int CLICK_DELAY = 300;

  private final static int MOVE_OFFSET = 20;

  private float mLastMotionY;

  private float mLastMotionX;

  private Timer cleanClickTimer = new Timer();

  private OnDoubleClickListener listener;

  public DoubleClick(OnDoubleClickListener l){

  listener = l;

  }

  public interface OnDoubleClickListener{

  void onDoubleClick();

  }

  public void dispatchTouchEvent(MotionEvent event){

  final float y = event.getY();

  final float x = event.getX();

  if (event.getAction() == MotionEvent.ACTION_DOWN) {

  mLastMotionY = y;

  mLastMotionX = x;

  clickCount++;

  if(clickCount == 1){

  firstClickTime = System.currentTimeMillis();

  //超过监听时间50MS还没有再次点击,则将点击次数,点击事件清零。

  cleanClickTimer.schedule(new TimerTask() {

  @Override

  public void run() {

  clickCount = 0;

  firstClickTime = 0;

  }

  }, CLICK_DELAY+50);

  }else if(clickCount == 2){

  long secondClickTime = System.currentTimeMillis();

  if (secondClickTime - firstClickTime <= CLICK_DELAY) {

  listener.onDoubleClick();

  }

  clickCount = 0;

  firstClickTime = 0;

  }

  }

  if(event.getAction() == MotionEvent.ACTION_MOVE){

  final int yDiff = (int) Math.abs(y - mLastMotionY);

  final int xDiff = (int) Math.abs(x - mLastMotionX);

  boolean yMoved = yDiff > MOVE_OFFSET;

  boolean xMoved = xDiff > MOVE_OFFSET;

  // 判断是否是移动

  if (yMoved || xMoved) {

  clickCount = 0;

  firstClickTime = 0;

  }

  }

  }

  }

  使用实例:

  [java]

  private DoubleClick doubleClick;

  //当需要使用双击事件监听,调用此方法即可。

  protected void enableDClickReturn(){

  doubleClick = new DoubleClick(new DoubleClick.OnDoubleClickListener() {

  @Override

  public void onDoubleClick() {

  //这里我的项目需要的功能是双击返回上一级Activity

  finish();

  }

  });

  }

  @Override

  public boolean dispatchTouchEvent(MotionEvent event) {

  if(doubleClick == null) {

  return super.dispatchTouchEvent(event);

  }else{

  doubleClick.dispatchTouchEvent(event);

  }

  return super.dispatchTouchEvent(event);

  } 

  社会需求随着经济发展也逐渐成递增趋势,企业对人才的需求早已拉开序幕,由于Java软件工程师出现巨大的需求,疯狂软件学院顺应潮流,推出Java培训班,以就业为导向,内容上与企业需求,实际工作更加吻合,能增加学员就业的绝对优势。疯狂Java团队大部分都是项目经理、技术总监,并且部分老师还是疯狂Java体系图书的作者。在老师讲解下,学员在最短的时间内掌握目前企业真正需要的最新技术,学员通过疯狂Java培训(疯狂软件学院官网http://www.fkjava.org/抢座热线:020-28309358,020-28309378咨询QQ:707552864,544627560),能够掌握非常过硬的实际操作技能,成为一名非常熟练的、优秀的软件开发人才。