繁体   English   中英

如何在父视图中使用OnClickListener,在子视图中使用onTouchEvent?

[英]How can I use OnClickListener in parent View and onTouchEvent in Child View?

我有一个自定义布局与标准setOnClickListener()调用。

setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // some click related code
            }
        });

在此布局中,应该是一个应该水平拖动的视图。

我写了一些代码,它或多或少地做了我想要它做的事情:

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean result = true;
    final int action = event.getAction();
    final float x = event.getRawX();
    final float y = event.getRawY();
    switch (action) {
        case MotionEvent.ACTION_DOWN: {
            mInitialTouchX = x;
            mInitialTouchY = y;

            mStartX = getX();
            mStartY = getY();
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            Logger.d("MOVE");
            if (direction == -1) {

            }

            final float dx = x - mInitialTouchX;
            final float dy = y - mInitialTouchY;

            mPosX = mStartX + dx;
            mPosY = mStartY + dy;

            if (Math.abs(dx) > SWYPE_MIN_TRAVEL) {
                if (Math.abs(mPosX) < maximumSwypeDistance) {
                    setTranslationX(mPosX);
                }
            }

            break;
        }
        case MotionEvent.ACTION_UP:
            Logger.d("UP");
        case MotionEvent.ACTION_CANCEL:
            Logger.d("CANCEL");
        case MotionEvent.ACTION_POINTER_UP:
            Logger.d("POINTER_UP");
            final float dx = x - mInitialTouchX;
            if (Math.abs(dx) < SWYPE_MIN_TRAVEL) {
                Logger.d("click");
                result = false;
            }
            break;
    }
    return result;
}

问题是:我怎么能同时拥有两者?

编辑:好吧,使用Gunnar Karlssons事件的答案,我可以改变代码,在ACTION_UP事件中手动执行点击,如下所示:

((ViewGroup) this.getParent()).performClick();

我不禁自己,但我发现这有点不满意。 我有更优雅的解决方案吗?

简短的回答是肯定的,你可以实现这种行为。 答案很长,你需要确保两个视图都能按预期获得触摸事件。 根据您所需的确切布局和预期行为,您可以使用以下几种方法:

  1. 您不必从onTouchEvent()返回true - 这样触摸事件也将转到父级(只需确保您获得下一个事件)。
  2. 在父项中使用onInterceptTouchEvent()并使用GestureDetector和SimpleOnGestureListener检测单击。

     GestureDetector.SimpleOnGestureListener simpleOnGestureListener = new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onSingleTapUp(MotionEvent e) { // some click related code return true; } }; GestureDetector gestureDetector = new GestureDetector(context, simpleOnGestureListener); @Override public boolean onInterceptTouchEvent(MotionEvent e){ gestureDetector.onTouchEvent(e); return false; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM