我正在制作一个自定义日历视图,它扩展了 LinearLayout 并具有每个日期的子视图。我想要做的是处理滑动和点击事件,就像你可以想象的那样,滑动是用来改变月份的,而点击则是用于选择日期并显示新的活动。为此,我在 CalendarView 上使用 GestureDetector,并且已经能够使其工作于滑动事件上。但是对于处理点击事件,我不知道该如何找到哪个子视图发生了点击。
- 有没有人有解决这个问题的想法?
- 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;
}
....
}