在onTouch ACTION_MOVE中更改视图高度

时间:2013-03-07 04:46:33

标签: android touch ontouchevent layoutparams

当用户在屏幕上向下移动手指时,我想更改视图高度。

    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发生时立即更改视图高度?

2 个答案:

答案 0 :(得分:4)

首先,您无需致电invalidate()requestLayout(),因为setLayoutParams() already does that因此再次手动调用只会导致不必要的开销。

第二次,失去mView.post()调用:无论如何,onTouch()在主(也称为UI)线程上执行。只需在onTouch()正文中执行layoutparams内容以及其他所有内容。

第三次,您的mView.post()调用可能会导致所有问题,因为View.post()会有效地将作业发布到UI线程的Handler,这会将作业排入队列直到UI线程可以一个接一个地自由执行它们。在你的情况下,它太忙于在每个事件上运行你的onTouch()方法,所以你发布的所有内容都会在你停止发送触摸事件时被执行 - 即停止拖动。

最后,这是我在实现可调整大小的视图时使用的主题的一个很好的参考,它也很可能涵盖你试图手动实现的所有功能:{ {3}}。注意他们如何只保存ACTION_DOWN块中的坐标,然后从那里测量高度,而不是调用getHeight()并用最后一个坐标增量递增它。这允许少一个操作+处理ACTION_DOWN并且使用mDragging布尔标志将允许您删除模糊的lastY = Float.MIN_VALUE;事物。

答案 1 :(得分:0)

而不是view.invalidate(),您可以使用view.requestLayout()

这不会超快,因为它会导致很多布局事件。在没有看到你的布局并知道你的目标是什么样的效果的情况下,很难给出更多的建议。