2012-07-27 44 views
7

Tôi muốn đăng ký sự kiện có thể nhấp trên ngón tay cái của thanh tìm kiếm để kích hoạt sự kiện khi người dùng đã nhấn vào nó. Có thể không?Ngón tay cái của Seekbar khi nhấp vào

+1

Bạn đã giải quyết vấn đề này chưa? – David

Trả lời

0

tôi làm điều đó theo cách này:

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); 
     } 
    }); 
+0

Tôi muốn chỉ có thể nhấp vào trong ngón cái. Điều đó nghe được kích hoạt cách nhấp vào trong tất cả các phần của thanh tìm kiếm – biquillo

1

tôi đã có thể đạt được điều này theo cách sau:

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 
      } 
     } 
    } 

hy vọng điều này giúp

+2

Điều này sẽ lắng nghe các sự kiện liên lạc trên toàn bộ thanh tìm kiếm thay vì chỉ là ngón tay cái. – Prateek

+0

Prateek là đúng, điều này sẽ cháy khi bạn di chuyển trên các phần khác của thanh tìm kiếm là tốt. –

+0

@ BjörnKechel trong khi thực sự điều này nghe để chạm vào các sự kiện trên tất cả thanh tìm kiếm nhưng nếu bạn chạm vào bất kỳ nơi nào khác ngoài ngón tay cái thì ACTION_MOVE sẽ được kích hoạt và trong ACTION_UP sẽ không có gì xảy ra nhờ câu lệnh if. – zwebie

2

Kết hợp zwebie và Nermeens câu trả lời cho phù hợp giải pháp:

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 
     } 
    } 
}); 

Vì vậy, điều này thực sự chỉ bắn trên ngón tay cái bấm, không di chuyển ngón tay cái và không bấm vào các phần khác của thanh tìm kiếm.

Bạn có thể điều chỉnh độ nhạy, vì đôi khi một lần nhấp đã di chuyển ngón tay cái một chút và cho phép ít thay đổi trong khi vẫn nhấp vào ít gây phiền toái. Một giá trị tốt ở đây phụ thuộc vào kích thước của thanh tìm kiếm và giá trị tối đa mà nó có thể có. Đối với tôi 3 đã làm việc tốt trên thanh tìm kiếm toàn chiều rộng với 50 max trên bố cục dọc.

+0

@ bất kỳ ai bị bỏ phiếu: Vui lòng cho tôi biết bạn nghĩ gì sai với câu trả lời của tôi. Nó hoạt động tốt hơn hai câu trả lời còn lại. –

+0

Cảm ơn, làm việc tốt cho tôi mặc dù không biết tại sao một số xuống bình chọn – Vicky

0

Tôi đã sử dụng câu trả lời của Bijom làm nguồn cảm hứng. Điều này sẽ kích hoạt khi ngón tay cái di chuyển như vậy nếu người dùng không nhấp vào ngón tay cái nó sẽ không di chuyển. Hi vọng điêu nay co ich. :)

Nếu bạn có bất kỳ câu hỏi nào về cách hoạt động, vui lòng nhận xét.

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 
     } 

    }); 
Các vấn đề liên quan