问题 Android搜索栏解决方案


是否可以仅在移动拇指时移动搜索条。 现在,搜索栏甚至在手指触摸时移动 progressdrawable。我们如何禁用搜索栏的移动 手指触摸progressdrawable?

谢谢。


2542
2018-03-20 13:38


起源

你能在哪里实现这个目标?我有同样的问题急需帮助 - Srikanth Pai
@Jay:嗨,我有同样的问题,就像你找到了解决方法吗?如果您有解决方案,请与我们分享...... - Rishi


答案:


覆盖 OnTouchListener 对于搜索栏而言,只处理拇指上的运动 MotionEvent 是一个移动事件。

event.getAction() == MotionEvent.ACTION_MOVE 

更新:1

像这样的东西可以工作,但问题是,即使用户移动拇指2个单位,搜索栏也会移动。你应该不要停止这种行为,因为它会弄乱搜索栏。

seekBar.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_MOVE){
                    Log.d(TAG, "Moved , process data, Moved to :" + seekBar.getProgress());
                    seekBar.setProgress(seekBar.getProgress());
                    return false;
                }
                Log.d(TAG, "Touched , Progress :" + seekBar.getProgress());
                return true;
            }
        });

2
2018-03-20 13:50



嗨,它对我来说有点用..但是当我点击搜索栏的时候,进步就是没有动作或者用拇指触摸......你可以给我详细信息吗?
更新答案:) - Ravi Vyas
嘿,但有时它不工作..
听听这里究竟发生了什么..当我触摸搜索栏时,它会自动进行而不会触摸或移动拇指..我只是想在我触摸移动拇指时进行它...
如果我只是在没有移动拇指的情况下触及搜索栏就会检测到运动事件......这是错误的..


我发现了问题 拉维的解决方案 是那种感动  移动到当前拇指位置之外仍然会导致跳跃。

下面的类解决了这个问题,并用一个小的增量替换了触摸式触摸,就像使用箭头键一样。


import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.SeekBar;

/**
 * A NoSkipSeekBar is an extension of {@link SeekBar} that prevents jumps in position
 * by touching outside the current thumb position. Such touches are replaced by
 * an increment or decrement the same as would be achieved using a DPAD's Left or
 * Right arrow keys.
 */
public class NoSkipSeekBar extends SeekBar {

    public NoSkipSeekBar(Context context) {
        super(context);
    }

    public NoSkipSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NoSkipSeekBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    private boolean isDragging;

    private boolean isWithinThumb(MotionEvent event) {
        return getThumb().getBounds().contains((int)event.getX(), (int)event.getY());
    }

    private void increment(int direction) {
        if (direction != 0) {
            final KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, 
                    direction < 0 ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT);
            onKeyDown(key.getKeyCode(), key);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (!isEnabled() || getThumb() == null) return super.onTouchEvent(event);

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (isWithinThumb(event)) {
                isDragging = true;
                return super.onTouchEvent(event);
            } else {
                return true;
            }

        case MotionEvent.ACTION_UP:
            isDragging = false;
            if (isWithinThumb(event)) {
                return super.onTouchEvent(event);
            } else {
                final Rect r = getThumb().getBounds();
                increment((int)event.getX() - (r.left + r.right) / 2);
                return true;
            }

        case MotionEvent.ACTION_MOVE:
            if (!isDragging) return true;
            break;

        case MotionEvent.ACTION_CANCEL:
            isDragging = false;
            break;
        }

        return super.onTouchEvent(event);
    }
}

8
2017-12-18 09:41



谢谢它帮助了我,这看起来像一个解决方案而不是像接受的答案那样的临时解决方法,+1 - serine
完美的工作 - 很好的答案 - Richard Le Mesurier


你看过这个:

真的相似的线程,可以帮助您解决您的问题:

SeekBar的拇指只在触摸时出现

祝你好运


0
2018-03-20 13:43



嗨我不想消失拇指,我只想禁用诱捕事件..用户无法触及搜索栏n增加进度。只有当我移动拇指时,进度才会增加。谢谢
现在发生了什么?当我点击任何地方的搜索栏区域而不触摸n移动到拇指,拇指将自动移动它是错误的我..用户只能进行触摸n移动拇指。


Ravi的解决方案很棒,我在下面做了一些重构:

两个目的:

  1. 解决了 getThumb() 只能使用API​​ 16以上问题的功能。
  2. 单击搜索栏将不会调用 onStopTrackingTouch() 但只能拖动拇指

这是我的代码:

public class NoSkipSeekBar extends SeekBar {

    Drawable mThumb;
    @Override
    public void setThumb(Drawable thumb) {
        super.setThumb(thumb);
        mThumb = thumb;
    }
    public Drawable getSeekBarThumb() {
        return mThumb;
    }

    public NoSkipSeekBar(Context context) {
        super(context);
    }

    public NoSkipSeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NoSkipSeekBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    private boolean isDragging;
    private boolean isStart = false;
    private boolean isWithinThumb(MotionEvent event) {
        Rect rect = getSeekBarThumb().getBounds();//increate the thumb invoke area
        Rect rect1 = new Rect();
        rect1.left = rect.left - 50;
        rect1.right = rect.right + 50;
        rect1.bottom = rect.bottom + 50;
        return rect1.contains((int)event.getX(), (int)event.getY());
    }

    private void increment(int direction) {
        if (direction != 0) {
            final KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN,
                    direction < 0 ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT);
            onKeyDown(key.getKeyCode(), key);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (!isEnabled() || getSeekBarThumb() == null) return super.onTouchEvent(event);

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (isWithinThumb(event)) {
                    isDragging = true;
                    isStart = true;
                    return super.onTouchEvent(event);
                } else {
                    return true;
                }

            case MotionEvent.ACTION_UP:
                isDragging = false;
                if(isStart){
                    isStart = false;
                    return super.onTouchEvent(event);
                }
                if (isWithinThumb(event)) {
                    return super.onTouchEvent(event);
                } else {
                    //final Rect r = getThumb().getBounds();
                    //increment((int)event.getX() - (r.left + r.right) / 2);
                    return true;
                }
            case MotionEvent.ACTION_MOVE:
                if (!isDragging) return true;
                break;

            case MotionEvent.ACTION_CANCEL:
                isDragging = false;
                break;
        }

        return super.onTouchEvent(event);
    }
}

0
2017-08-08 07:51