防止单击改变SeekBar进度

loh*_*das 9 android android-seekbar android-touch-event

SeekBar在我的Android应用程序中使用了一个.当用户单击任意位置时SeekBar,其进度值会发生变化.我只希望在用户滑动SeekBar拇指时改变进度值(就像UISlider在iOS中一样).

我已经尝试将clickable属性设置SeekBar为false但这不起作用.我怎样才能达到理想的行为?

Sli*_*lim 9

我本周遇到了同样的问题,我使用自定义SeekBar解决了它:遵循我的代码:

public class Slider extends SeekBar {

private Drawable mThumb;

public Slider(Context context) {
    super(context);

}

public Slider(Context context, AttributeSet attrs) {
    super(context, attrs);

}

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

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {

        if (event.getX() >= mThumb.getBounds().left
                && event.getX() <= mThumb.getBounds().right
                && event.getY() <= mThumb.getBounds().bottom
                && event.getY() >= mThumb.getBounds().top) {

            super.onTouchEvent(event);
        } else {
            return false;
        }
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        return false;
    } else {
        super.onTouchEvent(event);
    }

    return true;
}}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • FTW:thumb.getBounds().contains((int)event.getX(),(int)event.getY()) (4认同)

Era*_*ore 8

看看这个其他主题:

用户无法与Seekbar交互

我尝试了以下,它运作良好.注意我的搜索栏有android:max属性设置为100像这样:


<SeekBar
android:id="@+id/EnableBar"
android:layout_span="2"
android:max="100"
/>
Run Code Online (Sandbox Code Playgroud)
package com.androidbook.hiworld;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.SeekBar;


public class HiWorldActivity extends Activity {
    int originalProgress;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SeekBar seek = (SeekBar)findViewById(R.id.EnableBar);

        seek.setOnSeekBarChangeListener(
        new SeekBar.OnSeekBarChangeListener() {
           public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
               ((TextView)findViewById(R.id.SeekTxt)).setText("Value: "+progress);
               if(fromTouch == true){
                  // only allow changes by 1 up or down
                  if ((progress > (originalProgress+24))
                       || (progress < (originalProgress-24))) {
                     seekBar.setProgress( originalProgress);
                  } else {
                      originalProgress = progress;
                  }
               } 
           }

           @Override
           public void onStopTrackingTouch(SeekBar seekBar) {
               //Nothing here..                
           }

           @Override
           public void onStartTrackingTouch(SeekBar seekBar) {
               originalProgress = seekBar.getProgress();
           }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


bor*_*ift 1

我想出了一个解决方案,虽然不是很漂亮,但应该可以解决问题......

想法是这样的:

  1. 创建一个不可见的覆盖层,覆盖除拇指按钮之外的所有滑块

    (我使用了一个黑色的搜索栏作为覆盖层)

  2. 当按下拇指时,调用滑块上的“bringToFront”方法

  3. 当拇指松开时,在不可见的覆盖层上调用“bringToFront”方法

请注意,要实现此功能,您必须更改覆盖层的大小,以便它覆盖除拇指按钮之外的所有内容(我建议使用两个覆盖层[拇指按钮的每一侧各一个])

当您释放拇指按钮时,您应该调整覆盖层的大小

...就像我说的,它并不漂亮。我确信有更好的方法可以做到这一点,但如果你必须完成它,我会尝试这个。

   yourBarChangeListener yourBarChangeListener = new SeekBar.OnSeekBarChangeListener() { 

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

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) {
     // YOUR CODE HERE 
    } 
    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
    } 
}; 
yourBar.setOnSeekBarChangeListener(yourBarChangeListener);
Run Code Online (Sandbox Code Playgroud)