当前位置: 代码迷 >> Android >> 关于android的事件分发有关问题,会的进
  详细解决方案

关于android的事件分发有关问题,会的进

热度:45   发布时间:2016-04-28 04:46:33.0
关于android的事件分发问题,会的进!
网上找的所有资料都说,如果dispatchTouchEvent返回true,就会调用该view的onTouchEvent方法,问题是这样,我重写了一个listView类如下
private class MyListView extends ListView{
private boolean isScaling = false;
//private boolean isTwoPointer = false;
private float xDown;// 记录手指按下时的横坐标。  
    private float xMove;// 记录手指移动时的横坐标。  
    private float yDown;// 记录手指按下时的纵坐标。  
    private float yMove;// 记录手指移动时的纵坐标。  
public MyListView(Context context) {
super(context);
this.setDivider(null);
// TODO Auto-generated constructor stub
}
/*
 * (non-Javadoc)
 * @see android.widget.AbsListView#onTouchEvent(android.view.MotionEvent)
 * 处理listView的触摸事件
 */
@Override
public boolean onTouchEvent(MotionEvent ev){
Log.w("ViewPager", "onTouch event.getPointerCount()"+ev.getPointerCount() + " " +dst+" "+ndst);
switch (ev.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
if (ev.getPointerCount() == 2)
dst = measureFingers(ev);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:

if (ev.getPointerCount() == 2 && ndst < dst) {
upGranularity();
dst = -1;
}
break;

case MotionEvent.ACTION_MOVE:
if (ev.getPointerCount() >= 2) {
ndst = measureFingers(ev);
}
break;
}
if (ev.getPointerCount() >= 2)
return true;
return super.onTouchEvent(ev);
}
/*
 *  (non-Javadoc)
 * @see android.view.ViewGroup#dispatchTouchEvent(android.view.MotionEvent)
 *  * listView事件分发规则:
 * 状态:双指操作中isScaling.
 * 指头全放 :isScaling = false;
 * 任何状态为true时截断调用onTouch,否则分发给子View
 */
@Override
public boolean dispatchTouchEvent(MotionEvent ev){
Log.w("ViewPager", ""+ev.getPointerCount()+" "+isScaling);

switch (ev.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
Log.w("ViewPager", "Top dispatch down " +ev.getPointerCount());
if (ev.getPointerCount() == 1){
xDown = ev.getRawX();
yDown = ev.getRawY();
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
Log.w("ViewPager", "Top dispatch up");
if (ev.getPointerCount()==1) {
/*if (isScaling){
if (isTwoPointer) isTwoPointer = false; else
isScaling = false;
}*/
isScaling = false;
}
break;
case MotionEvent.ACTION_MOVE:
Log.w("ViewPager", "Top dispatch move");
xMove = ev.getRawX();
yMove = ev.getRawY();
break;
}
if (ev.getPointerCount() >= 2) isScaling = true;
if (isScaling) Log.w("ViewPager", "should be dealed"); else
Log.w("ViewPager", "should not be dealed");
if (isScaling) return true;
return super.dispatchTouchEvent(ev);
}
}

在dispatchTouchEvent结束前,我判断isScaling是否为true,如果true,在log输出should be dealed,并且该函数一定返回true,那么理论上,如果在log里出现了should be dealed,不是应该立即调用onTouchEvent,然后输出OnTouchEvent的log吗?
但实际情况是这样的:
07-16 18:23:04.994: W/ViewPager(31367): 2 true
07-16 18:23:04.994: W/ViewPager(31367): Top dispatch move
07-16 18:23:04.995: W/ViewPager(31367): should be dealed
07-16 18:23:04.999: W/ViewPager(31367): 2 true
07-16 18:23:04.999: W/ViewPager(31367): Top dispatch up
07-16 18:23:05.000: W/ViewPager(31367): should be dealed
07-16 18:23:05.011: W/ViewPager(31367): 1 true
07-16 18:23:05.012: W/ViewPager(31367): Top dispatch move
07-16 18:23:05.012: W/ViewPager(31367): should be dealed
07-16 18:23:05.025: W/ViewPager(31367): 1 true
07-16 18:23:05.026: W/ViewPager(31367): Top dispatch move
07-16 18:23:05.026: W/ViewPager(31367): should be dealed
07-16 18:23:05.027: W/ViewPager(31367): 1 true

求高手帮忙看看
------解决方案--------------------
恩,还没时间看,先MARK吧.
------解决方案--------------------
我只想问下,为啥你的标题是黑色的,,,
  相关解决方案