在移动事件期间中断SetOnTouchListener

时间:2013-12-13 07:24:39

标签: java android interrupt ontouchevent ontouchlistener

我尝试中断我为ImageView声明的setOnTouchListener。 关键是当用户手指靠近屏幕顶部时,停止监听器并对其进行“重置”,并在我的ImaeView布局上进行“重置”。

我的步骤是: - >创建OnTouchListener - >存储手指位置 - >如果手指靠近屏幕顶部(100像素),请将活动布局xml文件中的ImageView布局重置为默认值,并中断监听器。 - >要重复使用OnTouchListener,用户必须放下手指。

我的代码是这样的:

private void readyDeck() {
    // TODO Auto-generated method stub
    backCard = (ImageView)findViewById(R.id.leader_backCardImg);
    backCard.setVisibility(View.VISIBLE);
    backCard.setAlpha(255);
    backCard.setOnTouchListener(new OnTouchListener() {


        @Override
        public boolean onTouch(View v, MotionEvent me) {


            int eid = me.getAction();
            switch(eid){
                case MotionEvent.ACTION_MOVE:
                    DisplayMetrics displaymetrics = new DisplayMetrics();
                    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
                    int height = displaymetrics.heightPixels;
                    RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) backCard.getLayoutParams();
                    int y = (int) me.getRawY();
                    mParams.topMargin = y-height+(backCard.getHeight()/(1+(1/2)));
                    backCard.setLayoutParams(mParams);
                    int limit = backCard.getHeight();

                    if(y > limit){
                        mParams.topMargin = limit;
                        backCard.setLayoutParams(mParams);
                    }

                    else if(y < 255){
                        backCard.setAlpha(y);
                        if(y < 100){

                            backCard.setVisibility(View.GONE);
                            backCard.setOnTouchListener(null);
                            sendData();
                            break;
                        }

                    }

                    break;
                default:
                    break;
            }
            return true;
        }
    });

}

sendData()方法必须重置监听器,但如果我的代码如下:

public void sendData(){
   readyDeck();
}

即使我们没有将手指放在屏幕外,手指的位置也会被存储和使用。

你可以通过在sendData()方法中添加一些操作来看到它,比如删除一个ArrayList的随机项,这里是logCat:

12-13 08:01:06.400: I/System.out(17171): s4 removed.New Size : 51
12-13 08:01:06.460: I/System.out(17171): h6 removed.New Size : 50
12-13 08:01:06.520: I/System.out(17171): h1 removed.New Size : 49
12-13 08:01:06.560: I/System.out(17171): c1 removed.New Size : 48
12-13 08:01:06.605: I/System.out(17171): hk removed.New Size : 47
12-13 08:01:06.630: I/System.out(17171): d9 removed.New Size : 46
12-13 08:01:06.655: I/System.out(17171): d2 removed.New Size : 45
12-13 08:01:06.695: I/System.out(17171): h2 removed.New Size : 44
12-13 08:01:06.730: I/System.out(17171): d8 removed.New Size : 43
12-13 08:01:06.760: I/System.out(17171): s10 removed.New Size : 42
12-13 08:01:06.800: I/System.out(17171): h7 removed.New Size : 41
12-13 08:01:06.830: I/System.out(17171): d6 removed.New Size : 40
12-13 08:01:06.850: I/System.out(17171): h9 removed.New Size : 39
12-13 08:01:06.900: I/System.out(17171): s6 removed.New Size : 38
12-13 08:01:07.250: I/System.out(17171): c4 removed.New Size : 37
12-13 08:01:07.275: I/System.out(17171): d3 removed.New Size : 36
12-13 08:01:07.300: I/System.out(17171): cv removed.New Size : 35

我们可以看到该方法不会停止监听器,因为在将其转换为null之后,监听器再次加载了boolen OnTouch()。

你有办法打断听众吗?还有更多,重置我的ImageView的布局?谢谢!

1 个答案:

答案 0 :(得分:0)

我认为如果你在调用sendData()时只返回false,那么应该阻止对当前触摸事件的onTouch方法的进一步调用。来自developer website

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