前几天接到一个需求需要再现在调整音量屏幕亮度时显示实时的数值,比较简单的一个功能,记录一下
刚看到这个需求时,采用了一种办法来实现textview跟随seekbar的thumb随动代码如下。
sb_voice.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) {
resetViewTime();
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
volumnNumberDisplay.setText(String.valueOf(progress));
float textWidth = volumnNumberDisplay.getWidth();
float seekbatLeft = sb_voice.getLeft();
float seekbarMax = Math.abs(sb_voice.getMax());
final float scale = context.getResources().getDisplayMetrics().density;
float thumb = 5*scale + 0.5f;
float aveage = (((float)sb_voice.getWidth()) - 2 * thumb) / seekbarMax;
float currentProgress = progress;
float pox = seekbatLeft - textWidth/2 + thumb + aveage +currentProgress;
volumnNumberDisplay.setX(seekbatLeft + currentProgress);
}
这种方法就是用seekbar最左端+texiview宽度的一半+当前进度来决定textview的位置,但是出来后效果出现了偏差,textview再每个进度出现的位置有一点偏差,于是就换了一种方法。
sb_voice.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) {
if (!isNotMute) return;
Log.i("lvlin2","onProgressChanged");
resetViewTime();
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
volumnNumberDisplay.setText(String.valueOf(progress));
Log.i("lvlin2","voice_count" + progress);
volumnNumberDisplay.setVisibility(View.VISIBLE);
float thumbWidth = sb_voice.getThumb().getBounds().width();
float thumbLeft = sb_voice.getThumb().getBounds().left;
int marginStart = (int) (sb_voice.getLeft() + thumbLeft + thumbWidth / 2 - volumnNumberDisplay.getWidth() / 2 + 2);
volumnNumberDisplay.setX(marginStart);
}
});
这种方法直接用seekbar最左端+thumb的最左端+thumb宽度的一半-textview宽度的一般。这样就实现了需求,也比第一种办法准确了很多。