在Activity中只写一个TextView,只设置
textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {// 0:down; 1:up; 2 move
Log.d(TAG,"event:"+event.getAction());
return false;
}
});
点击按钮,发现只打印evet:0
这个是ACTION_DOWN事件,可以理解为return false没有对事件做处理。
然后修改为return true
textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {// 0:down; 1:up; 2 move
Log.d(TAG,"event:"+event.getAction());
return false;
}
});
点击按钮打印:event:0(ACTION_DOWN)-->2(ACTION_MOVE)-->1(ACTION_UP)
理解为对事件做处理。
你会发现上面两种写法,都是会出现代码块变黄。警告
大概意思是如果你对textView设置了onTouch事件,那它的onClick事件就受到影响了(如果你没有设置onClick则不影响可以不管),不论怎样我们还是最好去解决。大概意思是用performClick来解决。
假如你同时对textView设置了onTouch和onClick看有哪些影响
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG,"click");
}
});
textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {// 0:down; 1:up; 2 move
Log.d(TAG,"event:"+event.getAction());
return false;
}
});
点击后打印:0->2->1->click
分析,加了click后竟然打印出了2和1两个事件。说明添加click后onTouch虽然return false 但是打印了完整事件流程。
把return false改为true,点击后打印:
0->2->1
分析,竟然没有click事件。
经过上面分析:果然click和onTouch是相互影响的。那performClick就是两者之间的桥梁。修正他们两者正向影响(用户需求变更)。
在方法外忽略警告:
@SuppressLint("ClickableViewAccessibility")
private void initListener() {
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "click");
}
});
textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {// 0:down; 1:up; 2 move
Log.d(TAG, "event:" + event.getAction());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
textView.performClick();
break;
}
return true;
}
});
}
在onTouch return true;的时候在up事件中添加:textView.performClick();
点击打印:0->2->1->click
在onTouch return false;的时候在up事件中添加:textView.performClick();
0->2->1->click->click。
总结:则这个performClick是为了onTouch返回true的时候想调用onClick事件做优化的。