今天情人节,我却在家里看书写代码,真屌丝啊哈~
回顾:ViewGroup的时间分发流程:
Android之View和ViewGroup事件分发
dispatchTouchEvent ----- onInterceptTouchEvent----- onTouchEvent
最外层的ViewGroup首先接收到触摸事件,然后遍历他的子View或者ViewGroup,将触摸时间分发给包含触摸位置的子View,继续下去,直到该事件被消费(1.某个View的onTouchEvent返回了true;2.设置了监听并返回了true。这样该View的dispatchTouchEvent也就返回了true即事件被该View消费)onInterceptTouchEvent会拦截事件往下层传递,即中断事件传到子View,会执行自己的onTouchEvent。
下面的效果以前看到过,实现的思路挺不错的,算是对事件分发这些知识的实战吧。
在第一个listview里面上下滑动,由第一个listview分发事件。
在第二个listview里面上面滑动,三个listview均分发事件,实现一次触摸的联动效果。
在第二个listview里面的下面上下滑动,由第二个listview分发事件。
在第三个listview里面上下滑动,由第三个listview分发事件。
继承LinearLayot,拦截触摸事件,由自己重新分发。
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}
public boolean onTouchEvent(MotionEvent event) {
width = getWidth();
eventX = (int) event.getX();
childWidth = width / getChildCount();
if (eventX < childWidth) {
// 第一列的listview
event.setLocation(childWidth/2, event.getY());
getChildAt(0).dispatchTouchEvent(event);
}else if (eventX >childWidth && eventX < 2*childWidth) {
// 第二列的listview
event.setLocation(childWidth/2, event.getY());
if (event.getY() < getHeight()/2) {
// 第二列的listview上面
// 三个listview联动
for(int i = 0; i < getChildCount(); i++){
getChildAt(i).dispatchTouchEvent(event);
}
}else {
// 第二列的listview下面
getChildAt(1).dispatchTouchEvent(event);
}
}else {
//第三列listview
event.setLocation(childWidth/2, event.getY());
getChildAt(2).dispatchTouchEvent(event);
}
return super.onTouchEvent(event);
}
布局文件:
MainActivity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initList();
adapter = new SimpleAdapter(this, list, R.layout.item, new String[]{"iv"}, new int[]{R.id.iv});
lv1 = (ListView) findViewById(R.id.lv1);
lv2 = (ListView) findViewById(R.id.lv2);
lv3 = (ListView) findViewById(R.id.lv3);
lv1.setAdapter(adapter);
lv2.setAdapter(adapter);
lv3.setAdapter(adapter);
}
private void initList() {
for (int i = 0; i < 20; i++) {
HashMap map = new HashMap();
map.put("iv", R.drawable.ic_launcher);
list.add(map);
}
}