繁体   English   中英

MotionEvent.ACTION_UP 事件使用搜索栏触发两次

[英]MotionEvent.ACTION_UP event is fired twice with seekbar

onStopTrackingTouch 事件被触发两次,这是一个问题,因为我只需要发出一个 getRequest。 这是我的代码:

VerticalSeekbar.java

public boolean onTouchEvent(MotionEvent event) {

if (!isEnabled()) {
    return false;
}
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            super.onTouchEvent(event);
            int progress = getMax() - (int) (getMax() * event.getY() / getHeight());
            // Ensure progress stays within boundaries
            if(progress < 0) {progress = 0;}
            if(progress > getMax()) {
                progress = getMax();}
            setProgress(progress);  // Draw progress
            if(progress != lastProgress) {
                // Only enact listener if the progress has actually changed
                lastProgress = progress;
                Information.onSeekBarChangeListener.onProgressChanged(this, progress, true);
            }
            onSizeChanged(getWidth(), getHeight() , 0, 0);
            Log.i("radio", "action move");
            setPressed(true);
            setSelected(true);
        case MotionEvent.ACTION_UP:
            Log.i("radio", "action up"); //printed twice
            Information.onSeekBarChangeListener.onStopTrackingTouch(this);
            break;
        case MotionEvent.ACTION_CANCEL:
            break;
    }
    return true;
}

信息.java

onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){
            radio = (progress / (double) 10);
            tv_radio.setText(radio + " Km");
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar){
            Log.i("vertical", "onStart");
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar){
            Log.i("vertical", "onStopTracking"); //printed twice
            getRequest request = new getRequest();
            request.execute("http://...");
        }
    };
    sb_radio.setOnSeekBarChangeListener(onSeekBarChangeListener);

知道为什么MotionEvent.ACTION_UP被检测到两次吗? 即使我只是在Seekbar进行简单的点击而不进行拖动。

TouchListener将被要求每MotionEvent.ACTION_DOWNMotionEvent.ACTION_UPMotionEvent.ACTION_MOVE

所以问题是,在MotionEvent.ACTION_MOVE之后缺少break语句,因此即使您属于MotionEvent.ACTION_MOVE情况,控件也会继续执行进一步的情况,直到达到某个停止点,例如break

   switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
            super.onTouchEvent(event);
            int progress = getMax() - (int) (getMax() * event.getY() / getHeight());
            if(progress < 0) {progress = 0;}
            if(progress > getMax()) {
                progress = getMax();}
            setProgress(progress);  
            if(progress != lastProgress) {
                lastProgress = progress;
                Information.onSeekBarChangeListener.onProgressChanged(this, progress, true);
            }
            onSizeChanged(getWidth(), getHeight() , 0, 0);
            Log.i("radio", "action move");
            setPressed(true);
            setSelected(true);
            break;         // add a break statement here and problem solved
        case MotionEvent.ACTION_UP:
            Log.i("radio", "action up"); 
            Information.onSeekBarChangeListener.onStopTrackingTouch(this);
            break;
        case MotionEvent.ACTION_CANCEL:
            break;
    }
    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM