如何防止视图被触摸事件“按下”

时间:2014-12-02 20:26:16

标签: android android-view

我有RecyclerView我自己的OnItemClickListener实现。要突出显示所点击的项目,我使用简单的selector作为其背景:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/item_inner_rect_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/item_inner_rect" />
 </selector>

问题:因为我还使用OnTouchListener来检测从左到右的滑动手势,所以列表项变为&#34;按下&#34;当执行滑动手势时,虽然没有发生任何点击事件。结果,&#34;按下&#34; state drawable得到设置。

任何想法如何避免?

编辑:我的Touch侦听器看起来像这样(改编自其他一些解决方案):

public class OnSwipeTouchListener implements View.OnTouchListener {

private final GestureDetector gestureDetector;

public OnSwipeTouchListener(Context context) {
    gestureDetector = new GestureDetector(context, new GestureListener());
}

//not needed
public void onSwipeLeft() {
}

public void onSwipeRight() {
}

public boolean onTouch(View v, MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}

private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

    private static final int SWIPE_DISTANCE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;
    private static final int XY_VELOCITY_DIFFERENCE_THRESHOLD = 200;

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        if (e1 == null || e2 == null)
            return false;

        float distanceX = e2.getX() - e1.getX();
        float distanceY = e2.getY() - e1.getY();
        if (Math.abs(distanceX) > Math.abs(distanceY)
                && (Math.abs(velocityX) - Math.abs(velocityY) > XY_VELOCITY_DIFFERENCE_THRESHOLD)
                && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD
                && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
            if (distanceX > 0)
                onSwipeRight();
            else
                onSwipeLeft();
            return true;
        }
        return false;
    }
 }
}

编辑#2:我想我在某种程度上需要弄明白View何时成为&#34;按下&#34; (通过&#34;点击&#34;)来获得一个起点。任何想法都表示赞赏。

1 个答案:

答案 0 :(得分:2)

onTouch()方法中,返回false。这将告诉Android OnTouchListener不负责处理手势。