第一个和第二个ACTION_DOWN

时间:2017-10-06 15:19:55

标签: java android android-gesture

- 我想用这个问题完成的主要是区分单击和双击,我想根据单击/双击执行操作

我试图获取第一个和下一个MotionEvent.ACTION_DOWN之间的经过时间。我看到了this问题,他问我如何使用MotionEvent.ACTION_DOWNMotionEvent.ACTION_UPSystem.nanoTime();之间的经过时间我的问题不一样......

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之间经过的时间,任何想法?

我做过的研究:

AND COUNTLESS STACKOVERFLOW QUESTIONS。

我仍然无法找到我想要的东西。

编辑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包含以下手势类,要发布的内容很大,请查看HERE

在该信息中,该人说要使用以下内容来检测单击:

img.setOnTouchImageViewListener(new TouchImageView.OnTouchImageViewListener() {

        @Override
        public void onMove() {
            Toast.makeText(getApplicationContext(), "Single", Toast.LENGTH_LONG).show();               

        }
    });

但我仍有同样的问题,它无法区分单击和双击。即使我双击也会单拍。

我也看到this问题,但仍然没有运气。

2 个答案:

答案 0 :(得分:2)

为此您需要创建自定义手势检测器并初始化您的界面,单击,双击,长按。对于简单性, 这是您的代码:

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());

    } 

答案 1 :(得分:1)

您可以通过计算系统毫秒来实现它。 (在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);
}
});