2012-03-13 52 views
10

Tôi đang cố gắng thực hiện chuyển động của SeekBar trơn tru hơn là chỉ cần nhảy thẳng đến vị trí. Tôi đang làm điều này như tôi đã có một SeekBar với 3 tùy chọn cho một thực hiện kiểu thanh trượt.Làm cách nào để di chuyển thanh tìm kiếm trên Android một cách trơn tru?

Tôi đang tìm cách tạo thanh trượt mượt mà với 3 tùy chọn "Có", "Không có tùy chọn", "Không" cho một tính năng trong ứng dụng của tôi và SeekBar trông đẹp nhất và dễ nhất.

tôi đã cố gắng nhìn vào Android Animation và nó có vẻ hơi phức tạp chút, vì vậy nếu có ai có thể giúp đỡ bất kỳ sẽ được tốt đẹp :)

Trả lời

5

Built kiểm soát của riêng tôi. Công việc đã hoàn thành :) Mã số here

+1

+1 Bạn có thể thêm mã nguồn để bạn sẽ giúp khách truy cập trong tương lai. –

+0

Tôi sẽ, tôi sẽ đăng nó ngay khi tôi đẩy phiên bản mới nhất của ứng dụng của tôi. Tôi cho rằng mã nguồn mở của ứng dụng là –

+3

Như đã hứa - https://github.com/kennydude/Speaker/blob/master/src/me/kennydude/speaker/SmoothSeekBar.java vị trí đó sẽ được cập nhật dưới dạng cập nhật mã –

11

Tôi tìm thấy giải pháp sau đây để làm cho thanh tìm kiếm di chuyển trơn tru, nhưng vẫn chụp được một dải giá trị giới hạn. Giả sử bạn có các quan điểm sau đây trong cách bố trí của bạn:

<SeekBar 
    android:id="@+id/sldProgress" 
    style="@style/MySliderStyle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:max="100" 
    android:progress="50" /> 

<TextView 
    android:id="@+id/lblProgress" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="5" /> 

Bạn có thể sử dụng đoạn mã sau trong hoạt động của bạn (thay đổi giá trị của android: tối đa trong xml trên, và các yếu tố êm ái trong các mã dưới đây theo của bạn nhu cầu - giá trị cao hơn = mượt):

public class MyActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    sliderListener sldListener = new sliderListener(); 
    SeekBar sldProgress = (SeekBar) findViewById(R.id.sldProgress); 
    sldProgress.setOnSeekBarChangeListener(sldListener); 
    } 
    private class sliderListener implements OnSeekBarChangeListener { 
    private int smoothnessFactor = 10; 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progress = Math.round(progress/smoothnessFactor); 
     TextView lblProgress = (TextView) findViewById(R.id.lblProgress); 
     lblProgress.setText(String.valueOf(progress)); 
    } 

    public void onStartTrackingTouch(SeekBar seekBar) { 
    } 

    public void onStopTrackingTouch(SeekBar seekBar) { 
     seekBar.setProgress(Math.round((seekBar.getProgress() + (smoothnessFactor/2))/smoothnessFactor) * smoothnessFactor); 
    } 
    } 
} 
+4

Bất cứ ai downvoted này, xin vui lòng giải thích những gì là sai với câu trả lời - hãy nhớ, downvoting chỉ có nghĩa là để được sử dụng trong trường hợp cực đoan mà không có nỗ lực đi vào câu trả lời hoặc câu trả lời là nguy hiểm. Nếu câu trả lời là nguy hiểm, tôi muốn biết tại sao! Cảm ơn bạn. – Russ

+0

Integer.parseInt (String.valueOf (Math.round (progress/smoothnessFactor))); Điều này có vẻ không đúng. progress/smoothnessFactor sẽ luôn mang lại một int, vì vậy không cần phải làm tròn nó, sau đó bạn chỉ chuyển đổi nó thành một chuỗi rồi quay lại một int. – theelfismike

+4

Đó là tất cả? Hầu như sẽ nổ tung ứng dụng của bạn là nó? Tôi đã chỉnh sửa mã để xóa những chuyển đổi không cần thiết đó (bất kỳ ai cũng có thể làm điều đó - không cần bỏ phiếu). – Russ

1

bạn không cần phải xây dựng bất cứ điều gì mình chỉ sử dụng android hình ảnh động nó sẽ làm điều cho bạn

mã viết bằng kotlion

mySeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { 
     override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 
      //Todo: code 
     } 

     override fun onStartTrackingTouch(seekBar: SeekBar?) { 
     } 

     override fun onStopTrackingTouch(seekBar: SeekBar) { 
      if (seekBar.progress > 70) { 
       ObjectAnimator.ofInt(seekBar, "progress", 100).setDuration(100).start() 
      } else if (seekBar.progress < 30) { 
       ObjectAnimator.ofInt(seekBar, "progress", 0).setDuration(100).start() 
      } else { 
       ObjectAnimator.ofInt(seekBar, "progress", 50).setDuration(100).start() 
      } 
     } 
    }) 
Các vấn đề liên quan