4

ユーザーが画面上で指を下に動かしたときにビューの高さを変更したいのですが。

    new OnTouchListener() {
        float lastY = Float.MIN_VALUE;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_MOVE) {
                if (lastY != Float.MIN_VALUE) {
                    final float dist = event.getRawY() - lastY;

                    myView.post(new Runnable() {
                        @Override
                        public void run() {
                            ViewGroup.LayoutParams lp = myView.getLayoutParams();
                            lp.height += dist;
                            myView.setLayoutParams(lp);
                        }
                    });

                    view.invalidate();
                }
                lastY = event.getRawY();
            }

            if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) {
                lastY = Float.MIN_VALUE;
            }

            return true;
        }
    }

ただし、ビューの高さは、ユーザーが指の移動を停止した場合にのみ変更されます。

ACTION_MOVEが発生したときにビューの高さをすぐに変更するにはどうすればよいですか?

4

2 に答える 2

5

まず、呼び出す必要がないinvalidate()requestLayout()setLayoutParams() すでに呼び出しているため、手動で再度呼び出しても不要なオーバーヘッドが発生するだけです。

次にmView.post()呼び出しを失います:onTouch()とにかくメイン (別名 UI) スレッドで実行されます。onTouch()他のすべてと一緒に本体でlayoutparamsを実行するだけです。

第三に、ジョブを UI スレッドの に効果的に投稿するため、mView.post()呼び出しがおそらくすべての問題を引き起こしています。そして、あなたの場合、すべてのイベントでメソッドを実行するのが忙しすぎるため、タッチイベントの配信を停止すると、つまりドラッグを停止すると、投稿したすべてが実行されます。View.post()HandleronTouch()

最後に、サイズ変更可能なビューを実装する必要があったときに私が使用した件名に関する良いリファレンスを次に示します。これは、手動で実装しようとしているすべての機能をカバーする可能性が非常に高いです: GitHubの k9mail 独自のSplitViewクラス. ACTION_DOWN座標をブロックに保存してから、最後の座標デルタを呼び出しgetHeight()てインクリメントする代わりに、そこから高さを測定する方法に注意してください。これにより、操作ACTION_DOWNと処理が 1 つ少なくなり、mDragging ブール値フラグを使用すると、あいまいなlastY = Float.MIN_VALUE;ものを削除できます。

于 2013-03-07T07:25:51.427 に答える
0

代わりにview.invalidate()を使用できますview.requestLayout()

ただし、これは多くのレイアウトイベントを引き起こすため、超高速ではありません。レイアウトを見て、どのような効果を目指しているのかを知らずに、これ以上アドバイスするのは難しいです。

于 2013-03-07T05:32:30.933 に答える