我正在动态地将图像视图添加到父版面。我正在onTouch添加图像执行放大/缩小操作。我想删除它上面的onLongPress的添加视图。
img.setOnLongClickListener(longClickAction);
img.setOnTouchListener(touchAction);
onLongPress:
OnLongClickListener longClickAction = new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
parentLayout.removeView((ImageView)v);
return false;
}
};
onTouch:
OnTouchListener touchAction = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView i = (ImageView)v;
//perfrom zoom operation on touch of imageview
zoom(i, event);
return true;
}
};
只有Touch事件正在运行。为什么?我怎么能同时拥有?我哪里出错了?我该怎么做才能删除添加的视图?请帮我。提前致谢。
答案 0 :(得分:15)
onTouch
,因为这是将事件分派给视图的初始状态。当您长按视图时,这仍然会先调用onTouch
,因为您在true
中返回onTouch
(这意味着您已经消耗了此事件且不应再进一步调度)不要叫onLongPress
。诀窍是在false
onTouch
答案 1 :(得分:1)
正如@asenovm 所讨论的那样onTouch()总是被调用,因为它是将事件分派到视图的初始状态,但是如果我们返回值 false 在 onTouch()然后两者都会像魅力一样工作,问题将得到解决。
编辑:我对用户的建议是,不要同时实现OnLongClickListener()和OnTouch(),而是在双击事件中尝试使用OnLongClickListener()函数。
您可以通过以下方式实施双击:
int i = 0;
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
i++;
Handler handler = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
i = 0;
}
};
if (i == 1) {
//Single click
handler.postDelayed(r, 250);
} else if (i == 2) {
//Double click
i = 0;
ShowDailog();
}
}
});
答案 2 :(得分:0)
答案 3 :(得分:0)
试试这个,它对我来说很好。
boolean isMoving= false;
yourView.setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
isMoving = true;
Log.i("isMoving:", "true");
}
if(event.getAction()==MotionEvent.ACTION_UP){
isMoving=false;
Log.i("isMoving:","false");
}
return false;
}
});
yourView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(!isMoving){
//do onlongclick event here
}
return true;
}
});;
答案 4 :(得分:0)
如果您需要保持手指静止,那么在科特林(Kotlin)中最简单的方法就是这样
在 onCreateView 中:
view.setOnTouchListener(this)
view.setOnClickListener(this)
view.setOnLongClickListener {
if (! isFingerMoving) {
Toast.makeText(activity, "Long click detected", Toast.LENGTH_LONG).show()
//do something
}
false
}
在 onTouch 中:
fun onTouch(v: View?, event: MotionEvent): Boolean {
when (event.actionMasked) {
MotionEvent.ACTION_DOWN -> {
isFingerMoving = false
lastTouchX = event.getX(0)
lastTouchY = event.getY(0)
...
}
MotionEvent.ACTION_MOVE -> {
val deltaX = (x - lastTouchX) * event.xPrecision
val deltaY = (y - lastTouchY) * event.yPrecision
if ((deltaX.absoluteValue > 0.1) || (deltaY.absoluteValue > 0.1))
isFingerMoving = true
...
}
}
return false
}