当用户在屏幕上向下移动手指时,我想更改视图高度。
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发生时立即更改视图高度?
答案 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()
。
这不会超快,因为它会导致很多布局事件。在没有看到你的布局并知道你的目标是什么样的效果的情况下,很难给出更多的建议。