如果目标视图更改大小,是否需要刷新或重新设置onTouchListener?

时间:2013-03-08 16:35:04

标签: android

我有一些带有一些监听器的imageView,例如onClickListener和onLongClickListener。 onLongClickListener通过向同一视图添加onTouchListener来响应,以侦听运动事件。这样做的目的是当用户长按按钮时,他可以调整大小。

imageView调整大小工作(不是很好,但足以进行测试),但是,在调整大小后,附加到视图的所有侦听器仅响应imageView原始尺寸所覆盖区域中的触摸。因此,如果用户向下拉伸按钮以使其高度加倍,则只有上半部分会响应点击和触摸事件。

所以我必须要么;

  • 分离并重新连接所有听众?

  • 以某种方式更新听众?

这是我的代码

sendButton = (ImageView) findViewById(R.id.sendButton);
    sendButton.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            Log.d("long click", "long click");
            v.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    final int action = event.getAction();
                    int currentY = 0;
                    switch (action & MotionEvent.ACTION_MASK) {

                    case MotionEvent.ACTION_DOWN:
                        currentY = (int) event.getY();
                        break;

                    case MotionEvent.ACTION_MOVE:
                        if (event.getY() > currentY) {
                            Log.d("y dir", String.valueOf(event.getY()));
                            ViewGroup.LayoutParams params = buttonSpace
                                    .getLayoutParams();
                            params.height++;
                            buttonSpace.setLayoutParams(params);
                        } else if (event.getY() < currentY) {
                            Log.d("y dir", "up");
                            ViewGroup.LayoutParams params = buttonSpace
                                    .getLayoutParams();
                            params.height--;
                            buttonSpace.setLayoutParams(params);
                        }
                        currentY = (int) event.getY();
                        break;

                    }
                    return false;
                }
            });
            return true;
        }
    });

    sendButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            sendButtonPressed();
        }
    });

2 个答案:

答案 0 :(得分:1)

只是提示,您可以打开event.getAction(),如果您没有处理多个指针,则无需使用位掩码。

就您的问题而言,您应该在更改布局参数后请求布局。移除setLayoutParams()来电(您已修改附加视图的参数)并将其替换为buttonSpace.requestLayout()

答案 1 :(得分:0)

所以问题实际上是我的监听器附加到错误元素的事实。我将它附加到 sendButton (这是buttonSpace的孩子),但我只是调整 buttonSpace 的大小。

以下是重构代码,此处提供了其他改进。

buttonSpace = (RelativeLayout) findViewById(R.id.button_space);
buttonSpace.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            v.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    final int action = event.getAction();
                    ViewGroup.LayoutParams params = buttonSpace
                            .getLayoutParams();
                    switch (action) {

                    case MotionEvent.ACTION_DOWN:
                        oldY = (int) event.getY();
                        break;

                    case MotionEvent.ACTION_MOVE:
                        int newY = (int)event.getY();

                        int deltaY = 0;
                        if(oldY > 0){
                            deltaY = oldY - newY;
                        }
                        oldY = newY;
                        params.height -= deltaY;
                        buttonSpace.requestLayout();
                        break;
                    }
                    return false;
                }
            });
            return true;
        }
    });

    buttonSpace.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            sendButtonPressed();
        }
    });