2 freedom wings5 freedom_wings5 于 2016.05.04 14:42 提问

安卓关于View的滑动处理的问题,求大神指导指导

看了一下书,说一个view里,如果setOnTouchListener,那么onTouch()方法就会先于onTouchEvent()执行,
就是onTouch()会消耗了滑动事件,并返回true和不再调用onTouchEvent(),如果onTouch()返回false,表示未消耗滑动事件,然后就会调用onTouchEvent()处理。

然后我想了一想,如果onTouch()里消耗了滑动事件,但我又返回false,那么会是怎样的情况?于是我写了一下如下代码。

如下是OuterLayout extends LinearLayout,用来试验上述问题用的layout

 public class OuterLayout extends LinearLayout
{
    public OuterLayout(Context context)
    {
        this(context,null);
    }

    public OuterLayout(Context context,AttributeSet attrs)
    {
        this(context,attrs,0);
    }

    public OuterLayout(Context context,AttributeSet attrs,int defStyleAttr)
    {
        super(context,attrs,defStyleAttr);

    }

    public boolean onTouchEvent(MotionEvent ev)
    {
        switch(ev.getAction())
        {
        case MotionEvent.ACTION_DOWN:
            Log.e("test","now outer-layout action down");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.e("test","now outer-layout action move");
            break;
        case MotionEvent.ACTION_UP:
            Log.e("test","now outer-layout action up");
            break;

        }

        return true;
    }
}

在MainActivity中

LinearLayout outerLayout;

outerLayout=(LinearLayout)super.findViewById(R.id.outerlayout);
 outerLayout.setOnTouchListener(this);

public boolean onTouch(View v,MotionEvent event)
    {
        switch(event.getAction())
        {
        case MotionEvent.ACTION_DOWN:
            Log.e("test","on touch actiondown");
        case MotionEvent.ACTION_MOVE:
            Log.e("test","on touch action move");
        case MotionEvent.ACTION_UP:
            Log.e("test","on touch action up");
        }
        return false;
    }

就是outerLayout中覆写了onTouchEvent(),并setOnTouchListener(),然后下面观察一下后台输出:
图片说明
上图是布局,outerlayout是粉红色整块。

图片说明
图片说明
这个输出很奇怪,有大神解释解释为什么会有这样的结果吗?

1个回答

eyishion
eyishion   2016.05.08 03:20

这是因为你的MainActivity中的重写的onTouch方法里面的switch少了关键字**break**!,你加上就符合View的事件传递规则了!不信你可以试试!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!