View相关方法
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.d("TAG", "You down button");
break;
case MotionEvent.ACTION_UP:
Log.d("TAG", "You up button");
break;
case MotionEvent.ACTION_MOVE:
Log.d("TAG", "You move button");
break;
}
return true;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.d("TAG", "You down button");
break;
case MotionEvent.ACTION_UP:
Log.d("TAG", "You up button");
break;
case MotionEvent.ACTION_MOVE:
Log.d("TAG", "You move button");
break;
}
return false;
}
ViewGroup相关方法
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return false;
}
问题
listview里嵌套了一个自定义可以滑动和点击的SwitchButton,SwitchButton重新写了onTouchEvent方法,在滑动时绘制。
@Override
public boolean onTouchEvent(MotionEvent event)
{
Log.i(TAG, "onTouchEvent--->event->"+event.getAction());
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "onTouchEvent--->ACTION_DOWN");
mLastX = event.getX();
mDeltX = mSwitchOn ? 0 : mMoveLength;
moved = false;
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "onTouchEvent--->ACTION_MOVE");
mCurrentX = event.getX();
int diff = (int) (mCurrentX - mLastX);
if ((mSwitchOn && diff < 0))
{
mDeltX = 0;
}
else if ((!mSwitchOn && diff > 0))
{
mDeltX = mMoveLength;
}
else if (diff == 0)
{
mDeltX = mSwitchOn ? 0 : mMoveLength;
}
else
{
if (Math.abs(diff) >= mMoveLength)
{
mDeltX = diff > 0 ? mMoveLength : 0;
}
else
{
mDeltX = diff > 0 ? diff : mMoveLength + diff;
}
moved = true;
}
invalidate();
return super.onTouchEvent(event);
case MotionEvent.ACTION_UP:
Log.i(TAG, "onTouchEvent--->ACTION_UP");
if (moved)
{
if (mDeltX > mMoveLength / 2)
{
setSwitch(false);
}
else
{
setSwitch(true);
}
return true;
}
default:
break;
}
return super.onTouchEvent(event);
}
如果不前套listview,怎么滑动都没问题,最后会走MotionEvent.ACTION_UP,响应setSwitch.
但是嵌套了listview,当手指移出此SwitchButton时,最后不会走MotionEvent.ACTION_UP,导致button按钮停在中间。
解决
方法一
嵌套了listview,当手指移出此SwitchButton时,最后会走MotionEvent.ACTION_CANCEL,将MotionEvent.ACTION_UP逻辑copy一份到case MotionEvent.ACTION_CANCEL下即可。
方法二
在case MotionEvent.ACTION_MOVE:最后时执行调用getParent().requestDisallowInterceptTouchEvent(true);拦截父控件处理MOVE的动作,也就是不让listview处理移出控件,发MotionEvent.ACTION_CANCEL。最后 子控件当手抬起时,走MotionEvent.ACTION_UP