标题安卓Seekbar进度条长按时更新不平滑
** 问题描述
安卓应用中使用SeekBar时,进度条更新不平滑,出现卡顿或跳跃现象,影响用户体验。
原因分析
SeekBar更新不平滑:
- 方法调用耗时
解决方案
将耗时的方法调用移动到另外的线程中
优化UI线程
避免在UI线程中执行耗时操作,我使用了Handler
将耗时任务移至后台线程,主要代码如下。
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_UPDATE_PROGRESS:
int value = msg.arg1;
Log.d(TAG, "value:" + value);
mDataManager.setSysValue(value);
break;
}
}
};
自定义接口
public interface OnSeekBarValueChangeListener {
void onSeekBarValueChanged(int value);
}
private OnSeekBarValueChangeListener onSeekBarValueChangeListener= new OnSeekBarValueChangeListener() {
@Override
public void onSeekBarValueChanged(int progress) {
Log.d(TAG, "onSeekBarValueChanged ->" + progress);
Message message = new Message();
message.what = MSG_UPDATE_PROGRESS;
message.arg1 = progress;
mHandler.removeMessages(MSG_UPDATE_PROGRESS);
mHandler.sendMessageDelayed(message, 100);
}
};
@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
int progress = progressViewSeekbar.getProgress();
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT:
if (hasFocus) {
progress--;
handleDpadLeft(progress);
return true;
}
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
if (hasFocus) {
progress++;
handleDpadRight(progress);
return true;
}
break;
case KeyEvent.KEYCODE_BACK:
break;
default:
break;
}
}
return false;
}
private void handleDpadLeft(int progress) {
if (!progressViewSeekbar.isEnabled()) {
return;
}
if (progress >= mMenuItem.getMinProgress()) {
progressViewSeekbar.setProgress(progress);
menuTxt.setText("" + (progress));
onSeekBarValueChangeListener.onSeekBarValueChanged( progress);
HalApi.playSoundEffect(mContext);
}
}
private void handleDpadRight(int progress) {
if (!progressViewSeekbar.isEnabled()) {
return;
}
// maxProgress is some
if (progress <= mMenuItem.getMaxProgress()) {
progressViewSeekbar.setProgress(progress);
menuTxt.setText("" + (progress));
onSeekBarValueChangeListener.onSeekBarValueChanged(progress);
}
}
至此问题解决。