【问题标题】:How can I use OnClickListener in parent View and onTouchEvent in Child View?如何在父视图中使用 OnClickListener,在子视图中使用 onTouchEvent?
【发布时间】:2015-07-19 11:04:57
【问题描述】:

我有一个带有标准 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();

我情不自禁,但我觉得这有点不满意。我有更优雅的解决方案吗?

【问题讨论】:

标签: android


【解决方案1】:

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

  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;
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2015-06-12
    • 2012-06-15
    • 2011-07-25
    • 1970-01-01
    • 2021-12-08
    • 2021-10-26
    相关资源
    最近更新 更多