onTouch, onLongClick 在 Android 中一起使用
Posted
技术标签:
【中文标题】onTouch, onLongClick 在 Android 中一起使用【英文标题】:onTouch, onLongClick together in Android 【发布时间】:2012-06-12 09:20:38 【问题描述】:我正在动态地将 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 事件起作用?
我怎样才能让它们都工作?
我应该怎么做才能删除添加的视图?
【问题讨论】:
@Siddhesh 关注我的below answer,问题就解决了。 【参考方案1】:onTouch
总是为您的视图调用,因为这是将事件分派到视图的初始状态。当你长按你的视图时,它仍然首先调用onTouch
,因为你在onTouch
中返回true
(这意味着你已经消费了这个事件,它不应该被进一步调度)你不会得到onLongPress
叫。诀窍是在onTouch
中返回false
【讨论】:
但是onTouch
和onLongPress
都会被调用。如果onLongPress
的意思是不打电话给onTouch
呢?
@LuisA.Florit:你找到解决方案了吗?我也遇到了同样的问题,onTouch 和 onLongPress 都同时被调用..【参考方案2】:
正如@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();
);
【讨论】:
【参考方案3】:试试这个,它对我来说很好。
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】:Dynamically remove controls
可以帮到你
using onTouch and onLongClick
【讨论】:
【参考方案5】:如果您需要手指保持静止,那么在 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
【讨论】:
【参考方案6】:你不能通过 setOnLongClickListener 和 setOnTouchListener 一起实现 因为当您在 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
)
【讨论】:
以上是关于onTouch, onLongClick 在 Android 中一起使用的主要内容,如果未能解决你的问题,请参考以下文章