第一和第二之间经过的时间 ACTION_DOWN
Elapsed time between first and second ACTION_DOWN
- 这个问题我想完成的主要是区分单击和双击,我想根据 single/double tap[= 执行操作29=]
我正在尝试获取第一个和下一个之间经过的时间 MotionEvent.ACTION_DOWN
。我看到 this 问题,他问如何使用 System.nanoTime();
获取 MotionEvent.ACTION_DOWN
和 MotionEvent.ACTION_UP
之间经过的时间 我的问题不一样...
Android 图片查看器有这个功能,当你双击 - 它放大。当你单击 - 它隐藏工具。我认为这是通过测量第一个和下一个之间的时间来完成的 ACTION_DOWN
这是我目前拥有的:
ImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
if(!gone){
hide.setVisibility(View.GONE);
gone = true;
}else{
hide.setVisibility(View.VISIBLE);
gone = false;
}
}
return true;
}
});
无论经过多少时间,上面的代码都会在每次点击时隐藏视图。
我正在寻找一种方法来测量第一个 MotionEvent.ACTION_DOWN
和下一个 MotionEvent.ACTION_DOWN
之间经过的时间,有什么想法吗?
我做过的研究:
- getDownTime() and getEventTime()
之间的区别
- Measure elapsed time between two MotionEvents in Android
- https://developer.android.com/reference/android/view/MotionEvent.html
和无数的堆栈溢出问题。
我仍然找不到我要找的东西。
编辑 1:
好的,所以我正在使用 this 库来处理图像视图的缩放,但是这个库不支持单个选项卡(我找不到说明它可以的文档)。现在我正试图通过检测一次点击来解决这个问题。这就是我现在拥有的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageHolder = (PhotoView) findViewById(R.id.ImageHolder);
ImageHolder.setImageURI(myUri);
ImageHolder.setOnTouchListener(new View.OnTouchListener() {
long lastDown = 0;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
long now = System.currentTimeMillis();
if(now - lastDown < 500) {// the second touch was 500ms less ago
Toast.makeText(getApplicationContext(), "Double Tap", Toast.LENGTH_LONG).show();
}
lastDown = now;
}
return true;
}
});
这可以很好地检测第一个和下一个之间的时间 ACTION_DOWN
,但它会覆盖库的功能,因此在实现此功能时双击缩放不起作用。
编辑 2:
我找到了 this that includes the following gesture class, it is to big to post so please have a look HERE。
在信息中,那个人说使用以下方法来检测单击:
img.setOnTouchImageViewListener(new TouchImageView.OnTouchImageViewListener() {
@Override
public void onMove() {
Toast.makeText(getApplicationContext(), "Single", Toast.LENGTH_LONG).show();
}
});
但我还是遇到了同样的问题,无法区分单击和双击。即使我双击也可以单击。
我也看到了this问题,但是还是不行。
您可以通过计算系统毫秒数来实现。 (在 if 中评论)
ImageView.setOnTouchListener(new View.OnTouchListener() {
long lastDown = 0;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
long now = System.currentTimeInMillis();
if(now - lastDown < 500) {
// the second touch was 500ms less ago
}
lastDown = now;
}
return super.onTouch(view, motionEvent);
}
});
为此,您需要创建自定义手势检测器并为单击、双击、长按初始化您的界面。为了简单起见,
这是您的代码:
img.setOnTouchListener(new MyTouchDetector(mContext,this));
public class MyTouchDetector extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener {
int position;
private Context mContext;
private GestureDetector mGestureDetector;
private ClickDetector clickDetector;
public MyTouchDetector(Context mContext, ClickDetector clickDetector) {
this.mGestureDetector = new GestureDetector(mContext, this);
this.clickDetector = clickDetector;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("onDoubleTap :", "" + e.getAction());
clickDetector.doubleClick();
return super.onDoubleTap(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.d("onSingleTap :", "" + e.getAction());
clickDetector.singleClick();
return super.onSingleTapConfirmed(e);
}
@Override
public boolean onDown(MotionEvent e) {
//return super.onDown(e);
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
Log.d("onLongPress :", "" + e.getAction());
}
- 这个问题我想完成的主要是区分单击和双击,我想根据 single/double tap[= 执行操作29=]
我正在尝试获取第一个和下一个之间经过的时间 MotionEvent.ACTION_DOWN
。我看到 this 问题,他问如何使用 System.nanoTime();
获取 MotionEvent.ACTION_DOWN
和 MotionEvent.ACTION_UP
之间经过的时间 我的问题不一样...
Android 图片查看器有这个功能,当你双击 - 它放大。当你单击 - 它隐藏工具。我认为这是通过测量第一个和下一个之间的时间来完成的 ACTION_DOWN
这是我目前拥有的:
ImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
if(!gone){
hide.setVisibility(View.GONE);
gone = true;
}else{
hide.setVisibility(View.VISIBLE);
gone = false;
}
}
return true;
}
});
无论经过多少时间,上面的代码都会在每次点击时隐藏视图。
我正在寻找一种方法来测量第一个 MotionEvent.ACTION_DOWN
和下一个 MotionEvent.ACTION_DOWN
之间经过的时间,有什么想法吗?
我做过的研究:
- getDownTime() and getEventTime() 之间的区别
- Measure elapsed time between two MotionEvents in Android
- https://developer.android.com/reference/android/view/MotionEvent.html
和无数的堆栈溢出问题。
我仍然找不到我要找的东西。
编辑 1:
好的,所以我正在使用 this 库来处理图像视图的缩放,但是这个库不支持单个选项卡(我找不到说明它可以的文档)。现在我正试图通过检测一次点击来解决这个问题。这就是我现在拥有的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageHolder = (PhotoView) findViewById(R.id.ImageHolder);
ImageHolder.setImageURI(myUri);
ImageHolder.setOnTouchListener(new View.OnTouchListener() {
long lastDown = 0;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
long now = System.currentTimeMillis();
if(now - lastDown < 500) {// the second touch was 500ms less ago
Toast.makeText(getApplicationContext(), "Double Tap", Toast.LENGTH_LONG).show();
}
lastDown = now;
}
return true;
}
});
这可以很好地检测第一个和下一个之间的时间 ACTION_DOWN
,但它会覆盖库的功能,因此在实现此功能时双击缩放不起作用。
编辑 2:
我找到了 this that includes the following gesture class, it is to big to post so please have a look HERE。
在信息中,那个人说使用以下方法来检测单击:
img.setOnTouchImageViewListener(new TouchImageView.OnTouchImageViewListener() {
@Override
public void onMove() {
Toast.makeText(getApplicationContext(), "Single", Toast.LENGTH_LONG).show();
}
});
但我还是遇到了同样的问题,无法区分单击和双击。即使我双击也可以单击。
我也看到了this问题,但是还是不行。
您可以通过计算系统毫秒数来实现。 (在 if 中评论)
ImageView.setOnTouchListener(new View.OnTouchListener() {
long lastDown = 0;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
long now = System.currentTimeInMillis();
if(now - lastDown < 500) {
// the second touch was 500ms less ago
}
lastDown = now;
}
return super.onTouch(view, motionEvent);
}
});
为此,您需要创建自定义手势检测器并为单击、双击、长按初始化您的界面。为了简单起见, 这是您的代码:
img.setOnTouchListener(new MyTouchDetector(mContext,this));
public class MyTouchDetector extends GestureDetector.SimpleOnGestureListener implements View.OnTouchListener {
int position;
private Context mContext;
private GestureDetector mGestureDetector;
private ClickDetector clickDetector;
public MyTouchDetector(Context mContext, ClickDetector clickDetector) {
this.mGestureDetector = new GestureDetector(mContext, this);
this.clickDetector = clickDetector;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d("onDoubleTap :", "" + e.getAction());
clickDetector.doubleClick();
return super.onDoubleTap(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.d("onSingleTap :", "" + e.getAction());
clickDetector.singleClick();
return super.onSingleTapConfirmed(e);
}
@Override
public boolean onDown(MotionEvent e) {
//return super.onDown(e);
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
Log.d("onLongPress :", "" + e.getAction());
}