public class CalendarEventView extends LinearLayout {
public CalendarEventView(Context context) {
super(context);
}
public CalendarEventView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CalendarEventView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if((event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP) && event.getAction() != MotionEvent.ACTION_MOVE){
Log.v("move", "click");
return true;
}
return false;
}
}
我有两个同步的浏览器。一个包含CalendarEventViews。他们保持同步,直到我将onClick和onLongClick添加到我的CalendarEventView(我在viewpager中设置了这些监听器)。
我的问题是我只能点击工作或滚动工作,但不能同时工作。换句话说,如何让CalendarEventView消耗点击次数,但让其父级处理移动/滚动。
注意:我不介意CalendarEventView和父(viewpager)是否能够处理事件,只要它们都接收到它。
答案 0 :(得分:0)
试试这个:
long eventStarted;
long threshold = 500; //500ms
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
eventStarted = System.currentTimeMillis();
Log.v("move", "action down");
return (true);
case MotionEvent.ACTION_MOVE:
return (System.currentTimeMillis() > (eventStarted + threshold));
case MotionEvent.ACTION_UP:
if (System.currentTimeMillis() <= (eventStarted + threshold)) {
//This is a click
}
eventStarted = 0;
return (true);
}
return false;
}
基本上,您更改默认OnClickListener
以实现您的版本,这样您就不会使用移动事件。
答案 1 :(得分:0)
ViewGroup是父节点,它首先接收interceptTouchEvent,如果某个子节点返回true,则父节点不会接收其他事件。
基本上,如果它实际是点击事件,你总是可以返回false,并对点击作出反应。通过treshold
检测到拖动答案 2 :(得分:0)
所以我无法解决它,但我找到了另一种选择。我查看了如何同步我的浏览器,并找到了一个不需要使用触摸事件的替代方案。我不再需要上面的自定义视图。以防它对某人有用:
// Synchronise both ViewPagers
// headerColumnViewPager.setOnTouchListener(new OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// contentColumnViewPager.onTouchEvent(event);
// return false;
// }
// });
// contentColumnViewPager.setOnTouchListener(new OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// headerColumnViewPager.onTouchEvent(event);
// return false;
// }
// });
headerColumnViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
private int mScrollState = ViewPager.SCROLL_STATE_IDLE;
@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
return;
}
contentColumnViewPager.scrollTo(headerColumnViewPager.getScrollX(), contentColumnViewPager.getScrollY());
}
@Override
public void onPageSelected(final int position) { }
@Override
public void onPageScrollStateChanged(final int state) {
mScrollState = state;
if (state == ViewPager.SCROLL_STATE_IDLE) {
contentColumnViewPager.setCurrentItem(headerColumnViewPager.getCurrentItem(), false);
}
}
});
contentColumnViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
private int mScrollState = ViewPager.SCROLL_STATE_IDLE;
@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
return;
}
headerColumnViewPager.scrollTo(contentColumnViewPager.getScrollX(), headerColumnViewPager.getScrollY());
}
@Override
public void onPageSelected(final int position) { }
@Override
public void onPageScrollStateChanged(final int state) {
mScrollState = state;
if (state == ViewPager.SCROLL_STATE_IDLE) {
headerColumnViewPager.setCurrentItem(contentColumnViewPager.getCurrentItem(), false);
}
}
});