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

 更新时间:2017年03月30日 10:46:24   投稿:jingxian  
下面小编就为大家带来一篇详谈Android中onTouch与onClick事件的关系(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

这几天遇到点关于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事件的关系(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Android实现广告图片轮播效果

    Android实现广告图片轮播效果

    这篇文章主要为大家详细介绍了Android实现广告图片轮播效果的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • android 字体颜色选择器(ColorPicker)介绍

    android 字体颜色选择器(ColorPicker)介绍

    本文将详细介绍android 字体颜色选择器(ColorPicker)需要了解更多的朋友可以参考下
    2012-11-11
  • Android 开启闪光灯做手电筒的详解

    Android 开启闪光灯做手电筒的详解

    本篇文章是对Android中开启闪光灯做手电筒的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Flutter中如何使用WillPopScope的示例代码

    Flutter中如何使用WillPopScope的示例代码

    这篇文章主要介绍了Flutter中如何使用WillPopScope,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Flutter开发之Shortcuts快捷键组件的用法详解

    Flutter开发之Shortcuts快捷键组件的用法详解

    在桌面端的开发中,键盘快捷键是非常常见而必要的,Flutter 既然可以开发桌面端应用,那必然要提供自定义快捷键,所以本文就来和大家讲讲Shortcuts组件的简单使用吧
    2023-05-05
  • Kotlin协程启动createCoroutine及创建startCoroutine原理

    Kotlin协程启动createCoroutine及创建startCoroutine原理

    这篇文章主要为大家介绍了Kotlin协程启动createCoroutine及创建startCoroutine原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Android中的JSON详细总结

    Android中的JSON详细总结

    一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换
    2013-01-01
  • Android Imageloader的配置的实现代码

    Android Imageloader的配置的实现代码

    这篇文章主要介绍了Android Imageloader的配置的实现代码的相关资料,需要的朋友可以参考下
    2017-07-07
  • 简单掌握Android Widget桌面小部件的创建步骤

    简单掌握Android Widget桌面小部件的创建步骤

    这篇文章主要介绍了简单掌握Android Widget桌面小部件的创建步骤,Widget一般采用web前端技术进行开发,需要的朋友可以参考下
    2016-03-03
  • android 获取手机内存及 内存可用空间的方法

    android 获取手机内存及 内存可用空间的方法

    下面小编就为大家带来一篇android 获取手机内存及SD卡内存可用空间的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03

最新评论