首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >触摸监听器优先于listscroll监听器

触摸监听器优先于listscroll监听器
EN

Stack Overflow用户
提问于 2013-07-22 08:57:22
回答 1查看 1.5K关注 0票数 0

我有一个水平的列表,滑动解除工作,除了滑动解除需要优先于滚动,即如果我从左向右滑动,但在最轻微的角度,它会认为我试图滑动解除一个项目,而不是沿着滚动列表。我认为最简单的方法是让它反过来,但不知道如何改变它,或者是否有更好的方法。

我已经修改了Lucas Rocha的twowayview和Roman Nurik/Tim Roes的swipedismissundolist

我不确定是否所有这些代码都是我应该查找的地方,但从我可以断定它们是相关的。

主要活动

代码语言:javascript
复制
   listView = (TwoWayView) findViewById(R.id.listView1);


    //need to add in emptyview and list view to show and gone them when emtpy/full


   imageAdapter = new ImageAdapter(this, products,emptyview,listView);


    listView.setAdapter(imageAdapter);


    VSwipeDismissList.OnDismissCallback callback = new VSwipeDismissList.OnDismissCallback() {
        @Override
        public VSwipeDismissList.Undoable onDismiss(AbsListView listView, final int position) {
            // Delete the item from your adapter (sample code):

            imageAdapter.remove(position);
            return null;

            }

    };

快速关闭

代码语言:javascript
复制
/**
 * Returns an {@link android.widget.AbsListView.OnScrollListener} to be
 * added to the {@link ListView} using
 * {@link ListView#setOnScrollListener(android.widget.AbsListView.OnScrollListener)}.
 * If a scroll listener is already assigned, the caller should still pass
 * scroll changes through to this listener. This will ensure that this
 * {@link SwipeDismissListViewTouchListener} is paused during list view
 * scrolling.</p>
 *
 * @see {@link SwipeDismissListViewTouchListener}
 */
private AbsListView.OnScrollListener makeScrollListener() {
    return new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int scrollState) {
            setEnabled(scrollState != AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);
        }

        @Override
        public void onScroll(AbsListView absListView, int i, int i1, int i2) {
        }
    };
}

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {...

双向视图

代码语言:javascript
复制
    private boolean maybeStartScrolling(int delta) {
    final boolean isOverScroll = (mOverScroll != 0);
    if (Math.abs(delta) <= mTouchSlop && !isOverScroll) {
        return false;
    }

    if (isOverScroll) {
        mTouchMode = TOUCH_MODE_OVERSCROLL;
    } else {
        mTouchMode = TOUCH_MODE_DRAGGING;
    }

    // Time to start stealing events! Once we've stolen them, don't
    // let anyone steal from us.
    final ViewParent parent = getParent();
    if (parent != null) {
        parent.requestDisallowInterceptTouchEvent(true);
    }

    cancelCheckForLongPress();

    setPressed(false);
    View motionView = getChildAt(mMotionPosition - mFirstPosition);
    if (motionView != null) {
        motionView.setPressed(false);
    }

    reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);

    return true;
}

private void maybeScroll(int delta) {
    if (mTouchMode == TOUCH_MODE_DRAGGING) {
        handleDragChange(delta);
    } else if (mTouchMode == TOUCH_MODE_OVERSCROLL) {
        handleOverScrollChange(delta);
    }
}

private void handleDragChange(int delta) {
    // Time to start stealing events! Once we've stolen them, don't
    // let anyone steal from us.
    final ViewParent parent = getParent();
    if (parent != null) {
        parent.requestDisallowInterceptTouchEvent(true);
    }

    final int motionIndex;
    if (mMotionPosition >= 0) {
        motionIndex = mMotionPosition - mFirstPosition;
    } else {
        // If we don't have a motion position that we can reliably track,
        // pick something in the middle to make a best guess at things below.
        motionIndex = getChildCount() / 2;
    }

    int motionViewPrevStart = 0;
    View motionView = this.getChildAt(motionIndex);
    if (motionView != null) {
        motionViewPrevStart = (mIsVertical ? motionView.getTop() : motionView.getLeft());
    }

    boolean atEdge = scrollListItemsBy(delta);

    motionView = this.getChildAt(motionIndex);
    if (motionView != null) {
        final int motionViewRealStart =
                (mIsVertical ? motionView.getTop() : motionView.getLeft());

        if (atEdge) {
            final int overscroll = -delta - (motionViewRealStart - motionViewPrevStart);
            updateOverScrollState(delta, overscroll);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-22 20:59:33

我发现了一个几乎相同的问题here

我将action down和action move代码添加到了swipedismiss的onTouch方法中

代码语言:javascript
复制
     @Override
   public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
        xDistance = yDistance = 0f;
        lastX = ev.getX();
        lastY = ev.getY();
        break;
    case MotionEvent.ACTION_MOVE:
        final float curX = ev.getX();
        final float curY = ev.getY();
        xDistance += Math.abs(curX - lastX);
        yDistance += Math.abs(curY - lastY);
        lastX = curX;
        lastY = curY;
        if(xDistance > yDistance)
            return false;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17778521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档