gpt4 book ai didi

android - 如何在Android中实现双指双击?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:18 24 4
gpt4 key购买 nike

我知道如何检测双击和双指触摸事件,但我如何将它们结合起来使用react,以便有人需要用两根手指双击?

默认情况下,Android 将长按作为第二种点击形式,但我特别需要双指双击。

最佳答案

我想要一个简单且可重复使用的界面,它可以监听双指双击并表现得像 GestureDetector。这样您就可以像这样使用它(所有剪切和粘贴可运行代码):

public class Example extends Activity {
SimpleTwoFingerDoubleTapDetector multiTouchListener = new SimpleTwoFingerDoubleTapDetector() {
@Override
public void onTwoFingerDoubleTap() {
// Do what you want here, I used a Toast for demonstration
Toast.makeText(Example.this, "Two Finger Double Tap", Toast.LENGTH_SHORT).show();
}
};

// Override onCreate() and anything else you want

@Override
public boolean onTouchEvent(MotionEvent event) {
if(multiTouchListener.onTouchEvent(event))
return true;
return super.onTouchEvent(event);
}
}

我创建了 SimpleTwoFingerDoubleTapDetector。 (这是一个很长的名称,但它是描述性的。您可以将其重命名为任何您想要的名称。)将这个新文件保存在您的项目中或作为库:

public abstract class SimpleTwoFingerDoubleTapDetector {
private static final int TIMEOUT = ViewConfiguration.getDoubleTapTimeout() + 100;
private long mFirstDownTime = 0;
private boolean mSeparateTouches = false;
private byte mTwoFingerTapCount = 0;

private void reset(long time) {
mFirstDownTime = time;
mSeparateTouches = false;
mTwoFingerTapCount = 0;
}

public boolean onTouchEvent(MotionEvent event) {
switch(event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
if(mFirstDownTime == 0 || event.getEventTime() - mFirstDownTime > TIMEOUT)
reset(event.getDownTime());
break;
case MotionEvent.ACTION_POINTER_UP:
if(event.getPointerCount() == 2)
mTwoFingerTapCount++;
else
mFirstDownTime = 0;
break;
case MotionEvent.ACTION_UP:
if(!mSeparateTouches)
mSeparateTouches = true;
else if(mTwoFingerTapCount == 2 && event.getEventTime() - mFirstDownTime < TIMEOUT) {
onTwoFingerDoubleTap();
mFirstDownTime = 0;
return true;
}
}

return false;
}

public abstract void onTwoFingerDoubleTap();
}

首先,关于 Android(一键式)GestureDetector 的几点说明:

  • Android 的 onDoubleTap() 事件使用来自 ViewConfiguration 的标准超时值。我指的是同一时间。
  • 它们测量从第一次点击手指按下事件到第二次点击手指按下事件所耗时,然后广播 onDoubleTap()onDoubleTapEvent()
    • onDoubleTap() 仅在第二次点击的手指按下事件发生时触发。
    • onDoubleTapEvent() 为第二次点击的每个 Action 触发:向下、移动和向上。

关于 SimpleTwoFingerDoubleTapDetector 的几点说明:

  • 我的超时是从第一个手指按下事件到最后一个手指弹起事件来衡量的,以防止错误的双击通知。我为默认的 ViewConfiguration 双击超时添加了一些额外的时间来解决这个问题。
  • Android 的 GestureDetector 测量倾斜度(两次点击的距离)。我在这里没有看到这样做的必要性,也没有检查每次点击时两根手指之间的距离。
  • 我只广播一个事件 onTwoFingerDoubleTap()

最后说明:您可以轻松地将其更改为像 OnTouchListener 一样运行:

  1. 更改 SimpleTwoFingerDoubleTapDetector 的定义:

    public abstract class SimpleTwoFingerDoubleTapListener implements OnTouchListener {
  2. 添加一个新的类变量:

    private View mFirstView;
  3. 更改ACTION_DOWN 案例:

    case MotionEvent.ACTION_DOWN:
    if(mFirstDownTime == -1 || mFirstView != v || hasTimedOut(event.getEventTime())) {
    mFirstView = v;
    reset(event.getDownTime());
    }
    break;
  4. ACTION_UP 案例中传递 mFirstView:

    onTwoFingerDoubleTap(mFirstView);
  5. 最后,更改 onTwoFingerDoubleTap() 方法以反射(reflect)点击了哪个 View :

    public abstract void onTwoFingerDoubleTap(View v);

关于android - 如何在Android中实现双指双击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12414680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com