在ImageView上的OnTouch中返回false但仍然消耗了事件

时间:2015-01-21 12:28:38

标签: android imageview ontouchlistener

我正在使用ImageView.onTouch()。 我为ACTION_MOVE返回false,但仍然消耗了onTouch()个事件。

imageView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent ev) {
                System.out.println("jan25 iv onTouch");

                if (ev.getActionMasked()==MotionEvent.ACTION_DOWN) {
                    System.out.println("jan25 iv ACTION_DOWN");
                    return true;
                }

                if (ev.getActionMasked()==MotionEvent.ACTION_MOVE){
                    System.out.println("jan25 iv ACTION_MOVE");
                    return false;

                }
                if (ev.getActionMasked()==MotionEvent.ACTION_UP){
                    System.out.println("jan25 iv ACTION_UP");
                    return true;
                }

                System.out.println("jan25 iv false");
                return false;

            }
        });

布局:

 <LinearLayout
        android:id="@+id/ll_magic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/red"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/abcd"
             />
    </LinearLayout>

请知道

3 个答案:

答案 0 :(得分:1)

似乎从视图的false回调中返回onTouchEvent()仅在收到ACTION_DOWN的第一个动作事件时有效。在非消费视图上设置OnTouchListener具有相同的语义。这似乎是dispatchTouchEvent()ViewGroup实施中的错误。在这么长的时间之后它似乎不会被修复,因为这会破坏错误地依赖于这种行为的实现。

作为解决方法,您可以设置一个标志,指示触摸事件的处理,并在处理之前进行检查。收到ACTION_UPACTION_CANCEL动作事件后,应重置此标志。

答案 1 :(得分:0)

自: http://developer.android.com/guide/topics/ui/ui-events.html

  

onTouch() - 返回一个布尔值,指示您的侦听器是否使用此事件。重要的是这个事件可以有多个相互跟随的动作。因此,如果在收到向下操作事件时返回false,则表示您尚未使用该事件,并且对此事件的后续操作也不感兴趣。因此,您不会在事件中调用任何其他操作,例如手指手势或最终的上行动作事件。

因此返回false不应该消耗该事件。你是如何确定事件被消耗的?

答案 2 :(得分:0)

这也有效,但我仍然不能100%确定你要做什么。这会将imageView可单击设置为false,因此应该允许触摸不被它消耗。另外,我添加了clickable到LinearLayout。

 imageView.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent ev) {
            System.out.println("jan25 iv onTouch");

            if (ev.getActionMasked()==MotionEvent.ACTION_DOWN) {
                System.out.println("jan25 iv ACTION_DOWN");
                return true;
            }

            if (ev.getActionMasked()==MotionEvent.ACTION_MOVE){
                System.out.println("jan25 iv ACTION_MOVE");
                imageView.setClickable(false);
                return false;

            }
            if (ev.getActionMasked()==MotionEvent.ACTION_UP){
                System.out.println("jan25 iv ACTION_UP");
                return true;
            }

            System.out.println("jan25 iv false");
            return false;

        }
    });

<LinearLayout
    android:id="@+id/ll_magic"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/red"
    android:clickable = "true"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/abcd"
         />
</LinearLayout>