移动端touch事件和click事件的区别

 我来答
可乐零七
高粉答主

2016-11-16 · 每个回答都超有意思的
知道顶级答主
回答量:6.3万
采纳率:76%
帮助的人:1亿
展开全部
1、xml布局文件

1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:gravity="center"
6 tools:context="com.example.eventtest.MainActivity" >
7
8 <ImageView android:id="@+id/imageView"
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:src="@drawable/ic_launcher" />
12
13 </LinearLayout>

  由于只是观察Touch、LongClick及Click三者之间对点击事件的响应关系,所以整个界面布局中仅仅放置了一个ImageView组件。

2、Java代码实现

1 package com.example.eventtest;
2
3 import android.support.v7.app.ActionBarActivity;
4 import android.os.Bundle;
5 import android.util.Log;
6 import android.view.Menu;
7 import android.view.MenuItem;
8 import android.view.MotionEvent;
9 import android.view.View;
10 import android.widget.ImageView;
11
12
13 public class MainActivity extends ActionBarActivity {
14
15 private ImageView imageView = null;
16 private String TAG = "MainActivity";
17 @Override
18 protected void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.activity_main);
21
22 imageView = (ImageView)findViewById(R.id.imageView);
23 imageView.setOnTouchListener(mOnTouchListener);
24 imageView.setOnLongClickListener(mOnLongClickListener);
25 imageView.setOnClickListener(mOnClickListener);
26 }
27
28 View.OnTouchListener mOnTouchListener = new View.OnTouchListener() {
29
30 @Override
31 public boolean onTouch(View arg0, MotionEvent event) {
32 // TODO Auto-generated method stub
33 if(event.getAction() == MotionEvent.ACTION_DOWN){
34 Log.d(TAG, "touch down");
35 return false; //1 FALSE
36 }
37 else if(event.getAction() == MotionEvent.touch move){
38 Log.d(TAG, "touch move");
39 return false; //2 FALSE
40 }
41 else if(event.getAction() == MotionEvent.ACTION_UP){
42 Log.d(TAG, "touch up");
43 return false; //3 FALSE
44 }
45 return false;
46 }
47 };
48
49
50 View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
51
52 @Override
53 public boolean onLongClick(View arg0) {
54 // TODO Auto-generated method stub
55 Log.d(TAG, "long click");
56 return false; //4 FALSE
57 }
58 };
59
60 View.OnClickListener mOnClickListener = new View.OnClickListener() {
61
62 @Override
63 public void onClick(View arg0) {
64 // TODO Auto-generated method stub
65 Log.d(TAG, "click"); //5 NULL
66 }
67 };
68
69 @Override
70 public boolean onCreateOptionsMenu(Menu menu) {
71 // Inflate the menu; this adds items to the action bar if it is present.
72 getMenuInflater().inflate(R.menu.main, menu);
73 return true;
74 }
75
76 @Override
77 public boolean onOptionsItemSelected(MenuItem item) {
78 // Handle action bar item clicks here. The action bar will
79 // automatically handle clicks on the Home/Up button, so long
80 // as you specify a parent activity in AndroidManifest.xml.
81 int id = item.getItemId();
82 if (id == R.id.action_settings) {
83 return true;
84 }
85 return super.onOptionsItemSelected(item);
86 }
87 }

  从上面给出的Java代码可以看出:

  1、分别为点击ImageView组件后
的Touch、LongClick及Click事件设置了OnTouchListener、OnLongClickListener及
OnClickListener监听器,并且在对应的响应方法onTouch()、onLongClick()及onClick()中进行了日志输出函数
的调用与返回值的设定。其中返回值的设定是本文的关键,某个响应方法返回的是true还是false,对于后续的响应方法的影响非常大,后面会慢慢地进行
分析。

  2、为了观察组件点击后的一系列响应情
况,利用Log类的d(Tag,
msg)方法来输出运行日志,由于系统本身在应用运行时会输出很多我们不必要查看的信息,所以最好在logcat中设置一个日志信息输出过滤器,名称要和
程序中的TAG字串相同。如此处的TAG为主类名字串“MainActicity”,那么Filter的名称也要取为“MainActicity”,设置
完之后保存,然后在logcat中选择debug选项(上述的d()方法对应debug,e()对应error(),还有几个类别感兴趣的朋友可以自己研
究),那窗口中就会只输出我们设定的打印信息了。如下图中的输出结果,看着简单、舒服。

 
 3、说明,java代码行35、39、43、56及65的注释是方法返回值的说明,由于onClick()方法无返回值,所以用NULL表示。在测试中
会对各种方法的返回值进行改变,形成不同的组合,然后通过输出的日志信息观察它们的响应情况。由于Android中对点击事件的响应顺序为touch
down-touch move-long click-touch up-touch
move-click(当然,不是每次点击均会产生所有的事件,这只是完整的流程描述),所以描述返回值组合时也是按照这个顺序。如上述代码中方法的返回
值组合为false-false-false-false-null,而且对组件的短按、长按、移开(短按+移开或长按+移开,算两种不同的状态)(移开
表示最终没有触发Click事件,但有可能触发LongClick事件)这四种点击状态都进行了测试,对于是否执行点击状态用yes/no表示,那么上面
代码运行后组件的长按+移开的完整组合(返回值和操作标记)就是false-false-false-false-null-no-yes-yes。

3、常规测试结果

  说了这么多,所谓有图有真相,不给出结果怎么说得清呢。如果表述有不恰当或者内容有缺陷的地方还希望朋友您能够指出,谢谢!

  按照上面的返回值组合(各方法均返回false),四种点击状态的打印日志信息如下:

  1、短按(组合:false-false-false-false-null-yes-no-no)

 
 短按其实专业点说是手指(或者触笔,有些手机和平板会配备)在应用界面的组件上轻触,结果为touch down-touch
up-click,有时候输出结果会是touch down-touch move-touch up-click(产生touch
move事件但还至于到long click事件)。

  2、长按(组合:false-false-false-false-null-no-yes-no)

 
 这里就产生了long click事件,输出为结果为touch down-touch move-long click-touch
move-touch up-click,其实touch
move事件的产生与否、个数和手指按压与抬起的速度有关,不必深究(后面还会提到不必深究的原因)。

  3、短按移开(组合:false-false-false-false-null-yes-no-yes)

  由于短按不会产生long click事件,而按压组件并最终移开后不会产生click事件,所以结果为touch down-touch move-touch up。

  4、长按移开(组合:false-false-false-false-null-no-yes-yes)

  到这里,就不要多解释了,日志输出结果为touch down-touch move-long click-touch move-touch up。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式