onTouch与onClick事件的关系

摘要:
3.长按屏幕,流程如下:onTouch,action=0onTouchEvent,action=0on Touch,action=20onTouch事件,action=20OnTouch,action=20nTouchEvent,action=20OnLongClickTouch,action=2onTouchEvent、action=20OnTouch,action=2 OnTouchEvents,action=2 onTouch,action=1onTouchEvent,action=1单击长按时,将触发onLongClick的响应,而不会向上移动,但稍后将继续触发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

测试代码如下:

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. FrameLayout frame = (FrameLayout)findViewById(R.id.container);
  7. LinearLayoutTest line = new LinearLayoutTest(this);
  8. line.setOnClickListener(new ClickListener());
  9. line.setOnLongClickListener(new LongClickListener());
  10. line.setOnTouchListener(new TouchListener());
  11. line.setLongClickable(true);
  12. frame.addView(line);
  13. }
  14. public class ClickListener implements OnClickListener {
  15. @Override
  16. public void onClick(View v) {
  17. Log.e("test","onClick");
  18. }
  19. }
  20. public class LongClickListener implements OnLongClickListener{
  21. @Override
  22. public boolean onLongClick(View v) {
  23. Log.e("test","onLongClick");
  24. return true;
  25. }
  26. }
  27. public class TouchListener implements OnTouchListener{
  28. @Override
  29. public boolean onTouch(View v, MotionEvent event) {
  30. Log.e("test","onTouch,action="+event.getAction());
  31. return false;
  32. }
  33. }
  34. }
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;
        } 
    }        
}
    1. public class LinearLayoutTest extends LinearLayout{
    2. public LinearLayoutTest(Context context) {
    3. super(context);
    4. }
    5. @Override
    6. public boolean onTouchEvent(MotionEvent event) {
    7. Log.e("test","onTouchEvent,action="+event.getAction());
    8. return super.onTouchEvent(event);
    9. }
    10. }  

免责声明:文章转载自《onTouch与onClick事件的关系》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇docker-compose volumes指令路径映射问题关于.Net中使用SQLite数据库的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redux简明学习

前面的话 这几天被redux折腾的够呛,看了很多视频,也看了很多资料。很多时候,感觉好像顿悟了,但实际上只是理解了其中的一个小概念而已。真正去做项目的时候,还是会卡壳。可能是学CSS和Javascript时花的时间太久了,学redux的时候有点浮躁。还有就是redux内容实在是不少,全部都看都理解,好像没什么必要。不看吧,用的时候总是有点力不从心。于是,决...

JS实现刷新iframe的方法

<iframe src="http://t.zoukankan.com/1.htm" name="ifrmname" id="ifrmid"></iframe> 方案一:用iframe的name属性定位 <input type="button" name="Button" value="Button"onclick="docu...

apicloud常用分享方法

app中经常会有分享的功能,不管是分享商品还是文字还是图片或者是发送给微信好友扣扣好友,一下做一总结。 分享的样式(分享所有的样式模块):MNActionButton。 在apicloud 中添加这个模块,不需要再config 中配置这个模块,但是如果是真机调试需要自定义云编译一下。 效果图展示:此模块综合效果还是比较好的,建议使用此模块 一、使用方法...

H50073:div 循环添加点击事件,swiper循环添加点击事件

1,div 循环添加点击事件 <div class="video home_video"> <div class="videolist"vpath="4.mp4"ipath="4.mp4"><img src="../common/images/theme/default/video_icon.png"&...

document.execCommand()的用法小记

项目中遇到金额输入框限制只能输入数字,输入特殊字符或者字母汉字时间隔不到1秒内容就会自动清空。跟正则纠缠多年的我初次见到,很是神奇-.- 代码实现: <input type="text" onkeyup="if(isNaN(value))execCommand('undo')" onafterpaste="if(isNaN(value))execCo...

让超链接点击后不跳转,可以用href = "https://tool.4xseo.com/article/267833.html",但是这个#就会锚点到页面最上边 点击链接后不跳转可以设置成

让超链接点击后不跳转,可以用href = "https://tool.4xseo.com/article/267833.html",但是这个#就会锚点到页面最上边     点击链接后不跳转可以设置成     1.<a href="javascript:void(0);" >javascript:void(0);</a>     2....