android 动态 显示 时间,Android——SeekBar动态显示进度

本文分享了一个Android小例子,SeekBar移动时当前进度也随之移动。原理是在SeekBar移动时改变当前时间位置,给出了具体代码实现。还提到了另一种实现方式,即修改LayoutParams,以及通过SeekBar的Thumb位置计算实时进度的marginLeft。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天给你们分享一下小例子,就是SeekBar在移动时,当前进度也一块儿移动,具体看图啦。

9112081f5be831f1bd81027ea0aa2243.pngweb

其实原理很简单,就是在Seekbar在移动时,改变当前时间的位置。

代码以下:ide

public class MainActivity extends RxAppCompatActivity {

private TextView seekCurTime, curTime, totalTime;

private SeekBar seekBar;

//移动步长

private float moveStep;

private int screenWidth;

private static final int TOTALTIME = 300;//5分钟,单位秒

private int curtime;//单位秒

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

initView();

initData();

}

private void initView() {

seekCurTime = (TextView) findViewById(R.id.curSeekTime);

curTime = (TextView) findViewById(R.id.curTime);

totalTime = (TextView) findViewById(R.id.totalTime);

seekBar = (SeekBar) findViewById(R.id.seekbar);

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

@Override

public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {

curtime = progress * TOTALTIME / 100;

curTime.setText(Utils.getAudioTime(curtime));

seekCurTime.setText(Utils.getAudioTime(curtime));

setSeekCurTimeLocation(progress);

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override

public void onStopTrackingTouch(SeekBar seekBar) {

}

});

}

private void initData() {

curTime.setText(Utils.getAudioTime(0));

totalTime.setText(Utils.getAudioTime(TOTALTIME));

seekBar.setMax(100);

screenWidth = getWindowManager().getDefaultDisplay().getWidth() - 60;

moveStep = ((float) screenWidth / 100) * 1.0f;

Observable.

.interval(1, TimeUnit.SECONDS)

.compose(this.bindToLifecycle())

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@Override

public void onCompleted() {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onNext(Long aLong) {

curtime++;

int progress = (int) ((float) curtime / TOTALTIME * 100);

seekBar.setProgress(progress);

curTime.setText(Utils.getAudioTime(curtime));

seekCurTime.setText(Utils.getAudioTime(curtime));

setSeekCurTimeLocation(progress);

}

});

}

private void setSeekCurTimeLocation(int progress) {

LinearLayout.LayoutParams layoutParams = (LinearLayout

.LayoutParams) seekCurTime.getLayoutParams();

int marginStart = (int) (progress * moveStep - seekCurTime.getWidth() / 2);

if (marginStart <= seekBar.getWidth() -seekCurTime.getWidth()) {

layoutParams.setMarginStart(marginStart);

}

seekCurTime.setLayoutParams(layoutParams);

}

@Override

protected void onDestroy() {

super.onDestroy();

}

}

其余实现方式:Android使用SeekBar时动态显示进度且随SeekBar一块儿移动

layout()方法我在使用时无效,因此换成修改LayoutParams了。svg

补充:

计算实时进度的marginLeft,还能够经过SeekBar的Thumb的位置来计算,相对更容易些。代码以下:this

private void setSeekProgressLocation() {

ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) seekProgressTv.getLayoutParams();

float thumbWidth = sb_progress.getThumb().getBounds().width();

float thumbLeft = sb_progress.getThumb().getBounds().left;

int marginStart = (int) (sb_progress.getLeft() + thumbLeft + thumbWidth / 2 - layoutParams.width / 2);

layoutParams.setMarginStart(marginStart);

seekProgressTv.setLayoutParams(layoutParams);

上述代码中sb_progress为seekbar,seekProgressTv为实时进度的TextView。.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值