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
Trả lời
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);
}
});
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
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
Đ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
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. –
@ 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
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.
@ 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. –
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
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
}
});
Bạn đã giải quyết vấn đề này chưa? – David