长按手势没有响应 ACTION_UP - 简单手势监听器

4

我正在尝试在长按时使imageView增大并在我松开手后恢复正常大小。

public class MainActivity extends Activity {
private class Erjan_gestures extends SimpleOnGestureListener{
    @Override
    public void onLongPress(MotionEvent event) {
        Log.wtf("x", "long press occurring");

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.wtf("x", "LONG PRESS - action down");
                image.getLayoutParams().height = 400;
                image.getLayoutParams().width = 400;
                RelativeLayout.LayoutParams for_answer1 = new   RelativeLayout.LayoutParams(300, 600);
                image.requestLayout();
                break ;
            case MotionEvent.ACTION_UP:
                //THIS CASE IS NEVER REACHED
                Log.wtf("x", "LONG PRESS - action up");
                image.getLayoutParams().height = oldH;
                image.getLayoutParams().width = oldW;
                image.requestLayout();
                break;
        }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    image= (ImageView)findViewById(R.id.card);
    button=(Button)findViewById(R.id.button);

    oldW = 500;
    oldH = 600;

    gestureDetector = new GestureDetector(new Erjan_gestures());
    gestureDetector.setIsLongpressEnabled(true);
    image.setOnTouchListener(new View.OnTouchListener(){

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP){
                Log.wtf("x", "action up is detected");
            }
            Log.wtf("x", "I m a card, and i know you click on me!");
            if(gestureDetector.onTouchEvent(event)) {
                Log.wtf("x", "this is onTouch(View v, MotionEvent event)");
                return true;
            }
            else return false;
        }
    });
}

然而我的imageView确实检测到了长按,并执行了ACTION_DOWN,但从未到达longpress()ACTION_UP部分。

这是因为长按不应该被分成up和down两个部分吗?

  1. 长按手势本身只包含按下(也称为 ACTION_DOWN)?
  2. 为什么长按中的 action_up 永远不会被执行?
2个回答

3

这是因为长按没有分为按下和松开两个动作,而只有一个“触发”动作。

实际上,“ACTION_DOWN”甚至是不正确的术语。长按与“ACTION_DOWN”没有任何关系,因为当用户按下按钮时,“ACTION_DOWN”并不会立即触发。它只会在特定的按住延迟后触发。“DELAY_PASSED”或类似名称可能更合适。

请注意,正常的按压仍然继续进行,并且其“ACTION_UP”仍将被触发。


1
这里提供了一种使用Holder类和onTouch()方法的解决方案。
public class MainActivity extends AppCompatActivity {
    boolean is_pressed = false;    
    ImageView image;
    Button button;
    int oldW, oldH;

    private final Handler handler = new Handler();
    private final Runnable runnable = new Runnable() {
        public void run() {
            if (is_pressed) {
                Log.wtf("x", "LONG PRESS - action down");
                image.getLayoutParams().height = 400;
                image.getLayoutParams().width = 400;
                RelativeLayout.LayoutParams for_answer1 = new RelativeLayout.LayoutParams(300, 600);
                image.requestLayout();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);    
        image = (ImageView) findViewById(R.id.imageView);
        button = (Button) findViewById(R.id.button);    
        oldW = 500;
        oldH = 600;

        image.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
            Log.wtf("x", "touching");
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                is_pressed = true;
                // 500ms - to determine that this is a long press
                handler.postDelayed(runnable, 500);
            } else if (event.getAction() == MotionEvent.ACTION_UP && is_pressed) {                 
                Log.wtf("x", "LONG PRESS - action up");
                image.getLayoutParams().height = oldH;
                image.getLayoutParams().width = oldW;
                image.requestLayout();
                is_pressed = false;
            } else return false;
            return true;
        }
        });
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接