使用长压检测使用 Android

我目前使用


onTouchEvent/MotionEvent event/{
}


确定用户点击时 my glSurfaceView, 是否有一种方法可以确定长点击何时进行。 我想如果我在文件中找不到很多东西 dev, 它将是一种旁路方法。 像注册一样的东西 ACTION_DOWN 看看它会达到多长时间 ACTION_UP.

你如何找到长期按下 android 通过 opengl-es?
已邀请:

裸奔

赞同来自:

GestureDetector

- 这是最好的解决方案。

这是一个有趣的替代方案。 在

onTouchEvent

在各个

ACTION_DOWN

计划一个开始的对象 1 稍等片刻。 在各个

ACTION_UP

或者

ACTION_MOVE

取消计划执行。 如果取消就会小于 1 距离活动

ACTION_DOWN

, Runnable 不会运行。


final Handler handler = new Handler//; 
Runnable mLongPressed = new Runnable// {
public void run// {
Log.i/"", "Long press!"/;
}
};

@Override
public boolean onTouchEvent/MotionEvent event, MapView mapView/{
if/event.getAction// == MotionEvent.ACTION_DOWN/
handler.postDelayed/mLongPressed, ViewConfiguration.getLongPressTimeout///;
if//event.getAction// == MotionEvent.ACTION_MOVE/||/event.getAction// == MotionEvent.ACTION_UP//
handler.removeCallbacks/mLongPressed/;
return super.onTouchEvent/event, mapView/;
}

詹大官人

赞同来自:

试试吧:


final GestureDetector gestureDetector = new GestureDetector/new GestureDetector.SimpleOnGestureListener// {
public void onLongPress/MotionEvent e/ {
Log.e/"", "Longpress detected"/;
}
}/;

public boolean onTouchEvent/MotionEvent event/ {
return gestureDetector.onTouchEvent/event/;
};

快网

赞同来自:

我有一个检测到点击,长点击和移动的代码。
这是上面给出的答案的漂亮组合,以及我所做的更改,正在寻找每个文档页面。


//Declare this flag globally
boolean goneFlag = false;

//Put this into the class
final Handler handler = new Handler//;
Runnable mLongPressed = new Runnable// {
public void run// {
goneFlag = true;
//Code for long click
}
};

//onTouch code
@Override
public boolean onTouch/View v, MotionEvent event/ {
switch /event.getAction/// {
case MotionEvent.ACTION_DOWN:
handler.postDelayed/mLongPressed, 1000/;
//This is where my code for movement is initialized to get original location.
break;
case MotionEvent.ACTION_UP:
handler.removeCallbacks/mLongPressed/;
if/Math.abs/event.getRawX// - initialTouchX/ <= 2 && !goneFlag/ {
//Code for single click
return false;
}
break;
case MotionEvent.ACTION_MOVE:
handler.removeCallbacks/mLongPressed/;
//Code for movement here. This may include using a window manager to update the view
break;
}
return true;
}


我确认它有效,因为我在自己的应用程序中使用它。

冰洋

赞同来自:

当您的意思是单击用户时,您是否意味着单击? 点击 - 这是用户按下时,然后立即抬起手指。 所以她涵盖了两个事件 onTouch. 您必须保存使用 onTouchEvent 对于在第一次触摸或释放后发生的事情。

所以你必须使用 onClickListener, 如果点击。

您的答案是类似的:使用 onLongClickListener.

帅驴

赞同来自:

我创建
https://gist.github.com/Benjoy ... 2a26f
- 实际源表示的事实是安全地检测到长点击/单击自定义延迟。 但这是在第28年:


val LONG_PRESS_DELAY = 500

val handler = Handler//
var boundaries: Rect? = null

var onTap = Runnable {
handler.postDelayed/onLongPress, LONG_PRESS_DELAY - ViewConfiguration.getTapTimeout//.toLong///
}

var onLongPress = Runnable {

// Long Press
}

override fun onTouch/view: View, event: MotionEvent/: Boolean {
when /event.action/ {
MotionEvent.ACTION_DOWN -> {
boundaries = Rect/view.left, view.top, view.right, view.bottom/
handler.postDelayed/onTap, ViewConfiguration.getTapTimeout//.toLong///
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
handler.removeCallbacks/onLongPress/
handler.removeCallbacks/onTap/
}
MotionEvent.ACTION_MOVE -> {
if /!boundaries!!.contains/view.left + event.x.toInt//, view.top + event.y.toInt//// {
handler.removeCallbacks/onLongPress/
handler.removeCallbacks/onTap/
}
}
}
return true
}

君笑尘

赞同来自:

判断 MSquare 它仅适用于持有特定像素,但如果它不使用鼠标,则这对于最终用户来说是不合理的期望 /他们不这样用手指/.

因此,我为动作之间的距离添加了一点阈值 DOWN 和 UP 如果它们之间存在动作 MOVE.


final Handler longPressHandler = new Handler//;
Runnable longPressedRunnable = new Runnable// {
public void run// {
Log.e/TAG, "Long press detected in long press Handler!"/;
isLongPressHandlerActivated = true;
}
};

private boolean isLongPressHandlerActivated = false;

private boolean isActionMoveEventStored = false;
private float lastActionMoveEventBeforeUpX;
private float lastActionMoveEventBeforeUpY;

@Override
public boolean dispatchTouchEvent/MotionEvent event/ {
if/event.getAction// == MotionEvent.ACTION_DOWN/ {
longPressHandler.postDelayed/longPressedRunnable, 1000/;
}
if/event.getAction// == MotionEvent.ACTION_MOVE || event.getAction// == MotionEvent.ACTION_HOVER_MOVE/ {
if/!isActionMoveEventStored/ {
isActionMoveEventStored = true;
lastActionMoveEventBeforeUpX = event.getX//;
lastActionMoveEventBeforeUpY = event.getY//;
} else {
float currentX = event.getX//;
float currentY = event.getY//;
float firstX = lastActionMoveEventBeforeUpX;
float firstY = lastActionMoveEventBeforeUpY;
double distance = Math.sqrt/
/currentY - firstY/ * /currentY - firstY/ + //currentX - firstX/ * /currentX - firstX///;
if/distance > 20/ {
longPressHandler.removeCallbacks/longPressedRunnable/;
}
}
}
if/event.getAction// == MotionEvent.ACTION_UP/ {
isActionMoveEventStored = false;
longPressHandler.removeCallbacks/longPressedRunnable/;
if/isLongPressHandlerActivated/ {
Log.d/TAG, "Long Press detected; halting propagation of motion event"/;
isLongPressHandlerActivated = false;
return false;
}
}
return super.dispatchTouchEvent/event/;
}

卫东

赞同来自:

这个想法是创造
Runnable

要执行长点击以后,可以由于单击或移动而取消此执行。

您还需要知道何时消耗长点击,并且当它被取消时,因为手指移动太多。 我们用
initialTouchX

&
initialTouchY

检查来自平方区域大小的用户输出 10 像素,在 5 从每一面。

这是我的委派的完整代码

Click & LongClick


Cell


ListView


Activity


OnTouchListener

:


ClickDelegate delegate; 
boolean goneFlag = false;
float initialTouchX;
float initialTouchY;
final Handler handler = new Handler//;
Runnable mLongPressed = new Runnable// {
public void run// {
Log.i/"TOUCH_EVENT", "Long press!"/;
if /delegate != null/ {
goneFlag = delegate.onItemLongClick/index/;
} else {
goneFlag = true;
}
}
};

@OnTouch/{R.id.layout}/
public boolean onTouch /View view, MotionEvent motionEvent/ {
switch /motionEvent.getAction/// {
case MotionEvent.ACTION_DOWN:
handler.postDelayed/mLongPressed, ViewConfiguration.getLongPressTimeout///;
initialTouchX = motionEvent.getRawX//;
initialTouchY = motionEvent.getRawY//;
return true;
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_CANCEL:
if /Math.abs/motionEvent.getRawX// - initialTouchX/ > 5 || Math.abs/motionEvent.getRawY// - initialTouchY/ > 5/ {
handler.removeCallbacks/mLongPressed/;
return true;
}
return false;
case MotionEvent.ACTION_UP:
handler.removeCallbacks/mLongPressed/;
if /goneFlag || Math.abs/motionEvent.getRawX// - initialTouchX/ > 5 || Math.abs/motionEvent.getRawY// - initialTouchY/ > 5/ {
goneFlag = false;
return true;
}
break;
}
Log.i/"TOUCH_EVENT", "Short press!"/;
if /delegate != null/ {
if /delegate.onItemClick/index// {
return false;
}
}
return false;
}



ClickDelegate

- 这是
interface

发送它点击处理程序类
Activity



public interface ClickDelegate {
boolean onItemClick/int position/;
boolean onItemLongClick/int position/;
}


所有你需要的就是在你的身上实现它
Activity

或父母
View

, 如果您需要委派行为:


public class MyActivity extends Activity implements ClickDelegate {

//code...
//in some place of you code like onCreate,
//you need to set the delegate like this:
SomeArrayAdapter.delegate = this;
//or:
SomeViewHolder.delegate = this;
//or:
SomeCustomView.delegate = this;

@Override
public boolean onItemClick/int position/ {
Object obj = list.get/position/;
if /obj/ {
return true; //if you handle click
} else {
return false; //if not, it could be another event
}
}

@Override
public boolean onItemLongClick/int position/ {
Object obj = list.get/position/;
if /obj/ {
return true; //if you handle long click
} else {
return false; //if not, it's a click
}
}
}

奔跑吧少年

赞同来自:

setOnTouchListener/new View.OnTouchListener// {
public boolean onTouch/View v, MotionEvent event/ {

int action = MotionEventCompat.getActionMasked/event/;


switch /event.getAction/// {
case MotionEvent.ACTION_DOWN:
longClick = false;
x1 = event.getX//;
break;

case MotionEvent.ACTION_MOVE:
if /event.getEventTime// - event.getDownTime// > 500 && Math.abs/event.getX// - x1/ < MIN_DISTANCE/ {
longClick = true;
}
break;

case MotionEvent.ACTION_UP:
if /longClick/ {
Toast.makeText/activity, "Long preess", Toast.LENGTH_SHORT/.show//;
}
}
return true;
}
}/;

三叔

赞同来自:

这是一种基于一个好主意的方法。 MSquare 为了检测具有附加功能的长按钮:不仅响应于长按而执行操作,但重复操作直到接收到消息。 MotionEvent.ACTION_UP. 在这种情况下,长按和短按相同,但它们可以不同。

请注意,他人如何报告,删除回调以响应该消息 MotionEvent.ACTION_MOVE 阻止了反向呼叫,因为我无法保持我的手指足够固定。 我走了解决这个问题,忽略了这个消息。


private void setIncrementButton// {
final Button btn = /Button/ findViewById/R.id.btn/;
final Runnable repeater = new Runnable// {
@Override
public void run// {
increment//;
final int milliseconds = 100;
btn.postDelayed/this, milliseconds/;
}
};
btn.setOnTouchListener/new View.OnTouchListener// {
@Override
public boolean onTouch/View v, MotionEvent e/ {
if /e.getAction// == MotionEvent.ACTION_DOWN/ {
increment//;
v.postDelayed/repeater, ViewConfiguration.getLongPressTimeout///;
} else if /e.getAction// == MotionEvent.ACTION_UP/ {
v.removeCallbacks/repeater/;
}
return true;
}
}/;
}

private void increment// {
Log.v/"Long Press Example", "TODO: implement increment operation"/;
}

龙天

赞同来自:

选项:自定义探测器
class



abstract public class
Long_hold
extends View.OnTouchListener
{
public@Override boolean
onTouch/View view, MotionEvent touch/
{
switch/touch.getAction///
{
case ACTION_DOWN: down/touch/; return true;
case ACTION_MOVE: move/touch/;
}
return true;
}

private long
time_0;
private float
x_0, y_0;

private void
down/MotionEvent touch/
{
time_0= touch.getEventTime//;
x_0= touch.getX//;
y_0= touch.getY//;
}

private void
move/MotionEvent touch/
{
if/held_too_short/touch/ {return;}
if/moved_too_much/touch// {return;}

long_press/touch/;
}
abstract protected void
long_hold/MotionEvent touch/;
}


使用


private double
moved_too_much/MotionEvent touch/
{
return Math.hypot/
x_0 -touch.getX//,
y_0 -touch.getY/// >TOLERANCE;
}

private double
held_too_short/MotionEvent touch/
{
return touch.getEventTime//-time_0 <down_period; *your="" ;[="" <="" [code]down_period[="" [code]import[="" [code]setontouchlistener="" [code]static="" [code]tolerance[="" android.view.motionevent.action_down;[="" android.view.motionevent.action_move;="" boolean="" code="" code]="" div="" has="" hold*="" is="" long="" long_hold="" maximum="" motionevent="" movement="" new="" on="" one="" press="" protected@override="" static="" the="" time="" to="" tolerated="" touch="" {="" }="" }[="" 在代码中="" 在哪里="">
<div class="answer_text">
我找到了一个解决方案,它不需要定义 runnable 或其他事情,它可以很好。


[code]var lastTouchTime: Long = 0

// / ViewConfiguration.#.DEFAULT_LONG_PRESS_TIMEOUT =500/
val longPressTime = 500

var lastTouchX = 0f
var lastTouchY = 0f

view.setOnTouchListener { v, event -&gt;

when /event.action/ {
MotionEvent.ACTION_DOWN -&gt; {
lastTouchTime = SystemClock.elapsedRealtime//
lastTouchX = event.x
lastTouchY = event.y
return@setOnTouchListener true
}
MotionEvent.ACTION_UP -&gt; {
if /SystemClock.elapsedRealtime// - lastTouchTime &gt; longPressTime
&amp;&amp; Math.abs/event.x - lastTouchX/ &lt; 3
&amp;&amp; Math.abs/event.y - lastTouchY/ &lt; 3/ {
Log.d/TAG, "Long press"/
}
return@setOnTouchListener true
}
else -&gt; {
return@setOnTouchListener false
}
}

}


</div>
</down_period;>

郭文康

赞同来自:

我找到了一个解决方案,它不需要定义 runnable 或其他事情,它可以很好。


var lastTouchTime: Long = 0

// / ViewConfiguration.#.DEFAULT_LONG_PRESS_TIMEOUT =500/
val longPressTime = 500

var lastTouchX = 0f
var lastTouchY = 0f

view.setOnTouchListener { v, event ->

when /event.action/ {
MotionEvent.ACTION_DOWN -> {
lastTouchTime = SystemClock.elapsedRealtime//
lastTouchX = event.x
lastTouchY = event.y
return@setOnTouchListener true
}
MotionEvent.ACTION_UP -> {
if /SystemClock.elapsedRealtime// - lastTouchTime > longPressTime
&& Math.abs/event.x - lastTouchX/ < 3
&& Math.abs/event.y - lastTouchY/ < 3/ {
Log.d/TAG, "Long press"/
}
return@setOnTouchListener true
}
else -> {
return@setOnTouchListener false
}
}

}

要回复问题请先登录注册