android - 如何在父 View 中处理 subview 的触摸事件

标签 android click swipe touch-event gesturedetector

我正在制作一个自定义日历 View ,它扩展了 LinearLayout 并且每个日期都有 subview 。我想做的是处理滑动和点击,正如你想象的那样,滑动用于更改月份,点击用于选择日期并显示新 Activity 。为此,我在 CalendarView 上使用 GestureDetector 并可以使其适用于滑动。但是要处理点击事件,我不知道如何找到发生点击的 subview 。

  1. 有没有人知道如何解决这个问题?
  2. 在 OnScroll(MotionEvent) 上返回 true 和 false 有什么区别?

下面是我的部分代码。

public class MonthView extends LinearLayout implements GestureDetector.OnGestureListener {

    public MonthView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        gestureDetector = new GestureDetector(this);
        initDateViews();
    }

    //other codes here
    ....

    private void initDateViews() {
        for(int i = 0; i < 42; i++) {
            DateView view = new DateView();
            //init date views and add to calendar view.
            ....
            calendar.Add(view);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Logger.debug(TAG, ">>> MonthView.onTouchEvent()");

        return gestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean OnSingleTapUp(MotionEvent event) {
        // how can I find a child view to handle click event?
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        // right to left
        if (e1.getX() - e2.getX() > minSwipeDistance) {
            this.prevMonth();
        }
        // left to right
        else if(e2.getX() - e1.getX() > minSwipeDistance) {
            this.nextMonth();
        }
        // bottom to top
        else if(e1.getY() - e2.getY() > minSwipeDistance) {
            this.prevMonth();
        }
        //top to bottom
        else if(e2.getY() - e1.getY() > minSwipeDistance) {
            this.nextMonth();
        }

        return false;
    }

    ....
}

最佳答案

on[GestureEvent] 回调的 bool 返回值表示回调函数是否消费了该事件。也就是说,在您的 onScroll 实现中,您将返回 true,因为您正在处理这些事件。

但是,onSingleTapUp 应该返回 false 以指示您希望将事件传递给 subview 。

然后您应该注册一个 OnClickListener,它能够处理以下每个 subview 的实际日期:

private void initDateViews() {
    for(int i = 0; i < 42; i++) {
        DateView view = new DateView();
        //init date views and add to calendar view.
        ....

        // register onClickListener for e.g. date
        view.setOnCLickListener(new DateOnClickListner(date))
        calendar.Add(view);
    }
}

使用OnclickListener 实现

class DateOnClickListner(Date date) extends View.OnClickListener {
    public void onClick(View v) {
        ...
    }
}

关于android - 如何在父 View 中处理 subview 的触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32410922/

相关文章:

iphone - UIScrollView 中的水平滑动

android - 捕获滑动以关闭事件

Android Studio 2.3.2 不打开 Android *.xml 布局文件

android - 垂直和水平中心

android - 寻找 Android Gmail SMTP Oauth 示例

用于单击背景+元素的 Jquery 选择器?

android - 在 Android 中为 ViewPager 设置默认页面

android - 如何在 Android 上设置 Http 连接超时

jQuery onclick 必须单击两次才能出现模式对话框

javascript - 仅使用 javascript 和元素单击 angularjs 按钮