Android 使用手势检测器Compat的奇怪行为

Android 使用手势检测器Compat的奇怪行为,android,using,Android,Using,我有一个DoubleTapButton类,它有一个奇怪的问题 该按钮在包含onClick、MainActivity.DoStuff的main_activity.xml文件中定义 问题是,当单击按钮时,按钮会在GestureDetector.OnDoubletaListener知道已完成一次或两次单击之前调用MainActivity.DoStuff 我的DoubleTapButton使用setTag()设置buttons标记,doStuff方法读取标记。标记设置正确,但直到调用doStuff方法之

我有一个DoubleTapButton类,它有一个奇怪的问题

该按钮在包含onClick、MainActivity.DoStuff的main_activity.xml文件中定义

问题是,当单击按钮时,按钮会在GestureDetector.OnDoubletaListener知道已完成一次或两次单击之前调用MainActivity.DoStuff

我的DoubleTapButton使用setTag()设置buttons标记,doStuff方法读取标记。标记设置正确,但直到调用doStuff方法之后。太晚了,没用了

我想我在这方面遗漏了一步,但我已经对这段代码进行了几天的混乱,似乎无法使它正常工作

活动\u main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<kenz.a.testbutton.DoubleTapButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Do Stuff"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:onClick="doStuff"/>
课堂主要活动

package kenz.a.testbutton;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

 import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
String TAG = "Kenz MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
public void doStuff(View view) {
    String s;
    if(view.getTag(view.getId())==null)s="Null";
    else s = view.getTag(view.getId()).toString();
    Log.d(TAG, "doStuff: "+view.getTag(view.getId()));
    Toast.makeText(this,s,Toast.LENGTH_SHORT).show();
 }
 }

对数输出 似乎onClick在GestureDetector.OnDoubleTapListener知道一次或两次单击已完成之前调用MainActivity.doStuff(视图)。我想我在这里遗漏了一个步骤,但我已经对这段代码进行了几天的混乱,似乎无法让它正常工作。

解决了

使用长按而不是双击,并删除了双击处理程序。按要求工作。MainActivity.doStuff现在获得标记中带有“Long”或“Single”的调用

我用它进行了一次缩放,一次点击一步缩放,长时间恢复正常

长钮扣

在此处输入代码
包kenz.a.testbutton;
导入android.content.Context;
导入android.util.AttributeSet;
导入android.util.Log;
导入android.view.GestureDetector;
导入android.view.MotionEvent;
导入android.view.view;
导入androidx.appcompat.widget.AppCompatButton;
导入androidx.core.view.GestureDetectorCompat;
公共类长按钮
扩展AppCompatButton
实现GestureDetector.OnTestureListener{
私有字符串标记=“KENZ LongButton”;
私人手势检测器;
Long dtime=System.currentTimeMillis();
公共长按钮(上下文上下文、属性集属性){
超级(上下文,attrs);
mDetector=new GestureDetectorCompat(上下文,this);
setOnTouchListener(新的OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
返回mDetector.onTouchEvent(事件);
}
});
}
@凌驾
公共布尔onDown(运动事件e){
返回false;
}
@凌驾
在ShowPress上公开作废(运动事件e){
}
@凌驾
公共布尔onSingleTapUp(运动事件e){
Long curTime=System.currentTimeMillis();
if(curTime dtime<200)setTag(getId(),“双击”);
否则{
dtime=System.currentTimeMillis();
setTag(getId(),“单击”);
}
返回false;
}
@凌驾
公共布尔onScroll(MotionEvent e1、MotionEvent e2、浮点距离X、浮点距离Y){
返回false;
}
@凌驾
公开无效在线新闻(运动事件e){
d(标记“onLongPress:settingview标记(“+getId()+”)Long”);
setTag(getId(),“长点击”);
}
@凌驾
公共布尔onFling(MotionEvent e1、MotionEvent e2、float-velocityX、float-velocityY){
返回false;
}
}
package kenz.a.testbutton;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

 import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
String TAG = "Kenz MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
public void doStuff(View view) {
    String s;
    if(view.getTag(view.getId())==null)s="Null";
    else s = view.getTag(view.getId()).toString();
    Log.d(TAG, "doStuff: "+view.getTag(view.getId()));
    Toast.makeText(this,s,Toast.LENGTH_SHORT).show();
 }
 }
07-25 23:16:15.154 26047-26047/kenz.a.testbutton D/Kenz MainActivity: doStuff: null
07-25 23:16:15.334 26047-26047/kenz.a.testbutton D/KENZ DoubleTapButton: onSingleTapConfirmed: Setting View Tag(-1) Single
07-25 23:16:21.450 26047-26047/kenz.a.testbutton D/Kenz MainActivity: doStuff: Single
07-25 23:16:21.580 26047-26047/kenz.a.testbutton D/KENZ DoubleTapButton: onDoubleTap: Setting View Tag(-1) Double
07-25 23:16:25.074 26047-26047/kenz.a.testbutton D/Kenz MainActivity: doStuff: Double
07-25 23:16:25.204 26047-26047/kenz.a.testbutton D/KENZ DoubleTapButton: onDoubleTap: Setting View Tag(-1) Double
07-25 23:16:27.436 26047-26047/kenz.a.testbutton D/Kenz MainActivity: doStuff: Double
07-25 23:16:27.646 26047-26047/kenz.a.testbutton D/KENZ DoubleTapButton: onSingleTapConfirmed: Setting View Tag(-1) Single
enter code here
package kenz.a.testbutton;

    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;

    import androidx.appcompat.widget.AppCompatButton;
    import androidx.core.view.GestureDetectorCompat;

public class LongButton
    extends AppCompatButton
    implements GestureDetector.OnGestureListener {

private String TAG = "KENZ LongButton";
private GestureDetectorCompat mDetector;
Long dtime = System.currentTimeMillis();

public LongButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    mDetector = new GestureDetectorCompat(context,this);
    setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return mDetector.onTouchEvent(event);
        }
    });
}
@Override
public boolean onDown(MotionEvent e) {
    return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
    Long curTime = System.currentTimeMillis();
    if(curTime-dtime < 200) setTag(getId(),"Double Click");
    else {
        dtime = System.currentTimeMillis();
        setTag(getId(), "Single Click");
    }
    return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    return false;
}
@Override
public void onLongPress(MotionEvent e) {
    Log.d(TAG, "onLongPress: Setting View Tag("+getId()+") Long");
    setTag(getId(),"Long Click");
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    return false;
}

}