Android Seekbar&x27;他用拇指按一下

Android Seekbar&x27;他用拇指按一下,android,seekbar,Android,Seekbar,我想在seekbar的拇指上注册一个可点击事件,以便在用户点击它时触发事件。可能吗 我是这样做的: pagesSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { //listener @Override public void onStopTrackingTouch(final SeekBar seekBar) { //add your event here

我想在seekbar的拇指上注册一个可点击事件,以便在用户点击它时触发事件。可能吗

我是这样做的:

pagesSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { //listener
        @Override
        public void onStopTrackingTouch(final SeekBar seekBar) {
            //add your event here
        }

        @Override
        public void onStartTrackingTouch(final SeekBar seekBar) {
        }

        @Override
        public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) {
                updateControls(progress, false);
        }
    });

我能够通过以下方式实现这一点:

seekBar.setOnTouchListener(new OnTouchListener() 
{
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        if(event.getAction() == MotionEvent.ACTION_MOVE)
        {
            changedPosition = true;
            seekBar.setProgress(seekBar.getProgress());
            return false;
        }
        else if (event.getAction() == MotionEvent.ACTION_UP)
        {
            if(!changedPosition)
            {
                  //do action here
            }
        }
   }

希望这有助于结合zwebie和Nermeens的答案找到合适的解决方案:

seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    private int mProgressAtStartTracking;
    private final int SENSITIVITY;

    @Override
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
        // handle progress change
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        mProgressAtStartTracking = seekBar.getProgress();
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        if(Math.abs(mProgressAtStartTracking - seekBar.getProgress()) <= SENSITIVITY){
            // react to thumb click
        }
    }
});
seekbar.setonseekbarchaneglistener(新的seekbar.onseekbarchaneglistener(){
私人内部程序启动跟踪;
个人最终智力敏感度;
@凌驾
public void onProgressChanged(SeekBar SeekBar、int i、boolean b){
//处理进度变更
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
mprogressattstarttracking=seekBar.getProgress();
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{

if(Math.abs(mProgressAtStartTracking-seekBar.getProgress())我用了Bijom的答案作为灵感。当拇指移动时,它会触发,因此如果用户不点击拇指,它就不会移动。希望这有帮助。:)

如果您对它的工作原理有任何疑问,请随时发表评论

    mSeekBarSpeed.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        int progress = mSeekBarSpeed.getProgress();

        boolean started = false; //use this variable to see whether the user clicked the right place


        @Override
        public void onProgressChanged(SeekBar seekBar, int progressValue, boolean fromUser) {
            if(!started){ //check to see if user clicks the right place
                //if the user clicks within a specific threshold
                float threshold = (float)seekBar.getMax() / seekBar.getWidth() * seekBar.getThumb().getIntrinsicWidth() / 2;
                if(Math.abs(progressValue - progress) < threshold){
                     if(fromUser){ //checks if user actually clicked it
                         started = true;
                     }

                }else{
                    seekBar.setProgress(progress); //set to original progress
                    onStopTrackingTouch(seekBar); //not really necessary, keep or delete based on your needs
                    return; //get out of method
                }
            }

            if(started) {

                progress = progressValue; //update progress variable
                System.out.println("onProgressChanged:" + progress + "/" + seekBar.getMax());

                //DO WHAT YOU NEED TO DO WHEN PROGRESS IS CHANGING

            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            System.out.println("onStartTracking:" + progress + "/" + seekBar.getMax());
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            System.out.println("onStopTracking:" + progress + "/" + seekBar.getMax());
            //DO WHATEVER YOU NEED TO DO WHEN PROGRESS IS DONE CHANGING

            started = false; //remember to set variable to false
        }

    });
mSeekBarSpeed.setonseekbarchaneglistener(新的SeekBar.onseekbarchaneglistener(){
int progress=mSeekBarSpeed.getProgress();
boolean start=false;//使用此变量查看用户是否单击了正确的位置
@凌驾
public void onProgressChanged(SeekBar-SeekBar、int-progressValue、boolean-fromUser){
如果(!started){//请检查用户是否单击了正确的位置
//如果用户在特定阈值内单击
浮点阈值=(浮点)seekBar.getMax()/seekBar.getWidth()*seekBar.gethumb().getIntrinsicWidth()/2;
if(Math.abs(progressValue-progress)<阈值){
if(fromUser){//检查用户是否实际单击了它
开始=真;
}
}否则{
seekBar.setProgress(progress);//设置为原始进度
onStopTrackingTouch(seekBar);//实际上不需要,根据需要保留或删除
return;//退出方法
}
}
如果(启动){
progress=progressValue;//更新进度变量
System.out.println(“onProgressChanged:+progress+”/“+seekBar.getMax());
//当进度发生变化时,做你需要做的事情
}
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
System.out.println(“onStartTracking:+progress+”/“+seekBar.getMax());
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
System.out.println(“onStopTracking:+progress+”/“+seekBar.getMax());
//当进步完成时,做任何你需要做的事情
started=false;//记住将变量设置为false
}
});

我希望只能在拇指上单击。该侦听器在seek Bart的每个部分都会被触发单击。这将在整个seekbar上而不仅仅是拇指上侦听触控事件。Prateek是对的,当您移动到seekbar的其他部分时,这也会触发。@BjörnKechel,而这确实侦听触控事件s在所有seekbar上,但如果你在除拇指以外的任何地方触摸它,则会触发动作,并且在动作中,由于if语句,不会发生任何事情。@zwebie如果你在seekbar的任何部分上移动一点,它将改变position=true,即使它可能没有真正改变@where down-vote:reak请让我知道你认为我的答案有什么问题。它比其他两个答案更有效。谢谢,对我来说效果很好,尽管我不知道为什么有人说你解决了这个问题?