我正在动态地将 ImageViews 添加到父布局中,并对添加的图像执行放大/缩小操作onTouch
。
我想删除添加的视图并onLongPress
它。
img.setOnLongClickListener(longClickAction);
img.setOnTouchListener(touchAction);
上长按:
OnLongClickListener longClickAction = new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
parentLayout.removeView((ImageView)v);
return false;
}
};
触摸:
OnTouchListener touchAction = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView i = (ImageView)v;
// Perform zoom operation onTouch of ImageView
zoom(i, event);
return true;
}
};
为什么只有 onTouch 事件有效?
我怎样才能让他们都工作?
我应该怎么做才能删除添加的视图?
为您的视图调用onTouch
,因为这是将事件调度到视图的初始状态。当您长按视图时,这仍然会首先调用onTouch
并且由于您返回true
onTouch
(这意味着您已经使用了此事件并且不应进一步调度),因此您不会被调用onLongPress
。诀窍是返回false
onTouch
正如@asenovm所讨论的 onTouch() 总是被调用,因为它是将事件调度到视图的初始状态,但是如果我们在 onTouch() 中返回值 false,那么两者都会像魅力一样工作,问题就会得到解决。
编辑:我对用户的建议是,与其同时实现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();
}
}
});
试试这个,它对我来说很好用。
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;
}
});;
动态删除控件
可能对你有所帮助
使用 onTouch 和 onLongClick
如果您需要手指静止,那么在 Kotlin 中最简单的方法是这样的
在创建视图中:
view.setOnTouchListener(this)
view.setOnClickListener(this)
view.setOnLongClickListener {
if (! isFingerMoving) {
Toast.makeText(activity, "Long click detected", Toast.LENGTH_LONG).show()
//do something
}
false
}
在触摸中:
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
}
你不能通过setOnLongClickListener和setOnTouchListener来实现这个togither。因为当您在 onTouch 方法中返回 true 时,它假设您处理所有触摸事件,您可以通过开机自检延迟实现长按并在超时后调用方法,但您需要检查是否仍在按下或触发操作也许这个代码快照可以帮助你
mBinding.iv2.setOnTouchListener(object : View.OnTouchListener {
var stillPress = false
override fun onTouch(view: View?, motionEvent: MotionEvent?): Boolean {
if(motionEvent?.action == MotionEvent.ACTION_DOWN){
stillPress = true
Handler(Looper.getMainLooper()).postDelayed({
if(stillPress)
zoomImageFromThumb(view!!,R.drawable.ic_baseline_adb_24)
},1000)
}
if(motionEvent?.action == MotionEvent.ACTION_UP){
stillPress = false
mBinding.expandedImage.performClick()
}
return true
}
})