我有一些带有一些监听器的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();
}
});
答案 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();
}
});