1

onClickListener や onLongClickListener などのリスナーを持つ imageView があります。onLongClickListener は、同じビューに onTouchListener を追加して応答し、モーション イベントをリッスンします。これの目的は、ユーザーがボタンを長くクリックしたときに、サイズを変更できるようにすることです。

imageView のサイズ変更は機能しますが (あまりうまくいきませんが、テストには十分です)、サイズ変更後、ビューにアタッチされたすべてのリスナーは、 imageView の元のサイズでカバーされる領域でのタッチにのみ応答します。したがって、ユーザーがボタンを下に伸ばして高さを 2 倍にすると、上半分だけがクリックおよびタッチ イベントに応答します。

どちらかにする必要がありますか。

  • すべてのリスナーを切り離して再接続しますか?

  • どういうわけかリスナーを更新しますか?

これが私のコードです

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();
        }
    });
4

2 に答える 2

1

複数のポインターevent.getAction()を処理しない場合は、ビットマスクを使用する必要はありません。

あなたの問題に関しては、レイアウトパラメータを変更した後にレイアウトをリクエストする必要があります。呼び出しを削除しsetLayoutParams()(ビューに添付されているパラメーターを既に変更しています)、それらを に置き換えますbuttonSpace.requestLayout()

于 2013-03-08T17:17:05.053 に答える
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();
        }
    });
于 2013-03-10T15:24:24.513 に答える