欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详谈Android中onTouch与onClick事件的关系(必看)

程序员文章站 2023-11-11 08:54:04
这几天遇到点关于android的触摸事件相关的,还跟onclick有关,暂且记下: linearlayout分别设置了ontouchlistener,onclicklis...

这几天遇到点关于android的触摸事件相关的,还跟onclick有关,暂且记下:

linearlayout分别设置了ontouchlistener,onclicklistener,onlongclicklistener及ontouchevent回调

1、在屏幕上触摸之后基本的执行流程如下:

ontouch,action=0
ontouchevent,action=0
ontouch,action=2
ontouchevent,action=2
ontouch,action=2
ontouchevent,action=2
ontouch,action=1
ontouchevent,action=1
onclick

也就是先说ontouchlistener是最先被触发的,然后是本身的ontouchevent回调;当最后的up事件发生并被ontouchevent处理后才会触发onclicklistener。

2、把ontouchevent回调中的super.ontouchevent去除,直接返回true;则流程如下:

ontouch,action=0
ontouchevent,action=0
ontouch,action=2
ontouchevent,action=2
ontouch,action=2
ontouchevent,action=2
ontouch,action=1
ontouchevent,action=1

可以看到onclicklistener永远无法被触发,也侧面说明了对onclick的触发是在ontouchevent回调中来实现的。

3、长按屏幕,流程如下:

ontouch,action=0
ontouchevent,action=0
ontouch,action=2
ontouchevent,action=2
ontouch,action=2
ontouchevent,action=2
onlongclick
ontouch,action=2
ontouchevent,action=2
ontouch,action=2
ontouchevent,action=2
ontouch,action=1
ontouchevent,action=1
onclick

当长按的时候,无需到up就会触发onlongclick的响应,但之后也会继续触发onclick的响应。

4、但如果在onlongclick中返回true,则流程如下,即只在中间触发了onlongclick,之后会继续响应touch,但当up的时候就不会再触发onclick

ontouch,action=0

ontouchevent,action=0
ontouch,action=2
ontouchevent,action=2
ontouch,action=2
ontouchevent,action=2
onlongclick
ontouch,action=2
ontouchevent,action=2
ontouch,action=2
ontouchevent,action=2
ontouch,action=1
ontouchevent,action=1

测试代码如下:

public class mainactivity extends activity {
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    framelayout frame = (framelayout)findviewbyid(r.id.container);
    linearlayouttest line = new linearlayouttest(this);
    line.setonclicklistener(new clicklistener());
    line.setonlongclicklistener(new longclicklistener());
    line.setontouchlistener(new touchlistener());
    line.setlongclickable(true);
    frame.addview(line);
  }
  public class clicklistener implements onclicklistener {
    @override
    public void onclick(view v) {
      log.e("test","onclick");
    }
  }
  public class longclicklistener implements onlongclicklistener{
    @override
    public boolean onlongclick(view v) {
      log.e("test","onlongclick");
      return true;
    }
  }
  public class touchlistener implements ontouchlistener{
    @override
    public boolean ontouch(view v, motionevent event) {
      log.e("test","ontouch,action="+event.getaction());
      return false;
    } 
  }    
}

public class linearlayouttest extends linearlayout{
  public linearlayouttest(context context) {
    super(context);
  }
  @override
  public boolean ontouchevent(motionevent event) {
    log.e("test","ontouchevent,action="+event.getaction());
    return super.ontouchevent(event);
  }
}

以上这篇详谈android中ontouch与onclick事件的关系(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。