loh*_*das 9 android android-seekbar android-touch-event
我SeekBar在我的Android应用程序中使用了一个.当用户单击任意位置时SeekBar,其进度值会发生变化.我只希望在用户滑动SeekBar拇指时改变进度值(就像UISlider在iOS中一样).
我已经尝试将clickable属性设置SeekBar为false但这不起作用.我怎样才能达到理想的行为?
我本周遇到了同样的问题,我使用自定义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)
希望这可以帮助
看看这个其他主题:
我尝试了以下,它运作良好.注意我的搜索栏有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)
我想出了一个解决方案,虽然不是很漂亮,但应该可以解决问题......
想法是这样的:
创建一个不可见的覆盖层,覆盖除拇指按钮之外的所有滑块
(我使用了一个黑色的搜索栏作为覆盖层)
当按下拇指时,调用滑块上的“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)
| 归档时间: |
|
| 查看次数: |
12855 次 |
| 最近记录: |