其实原理很简单,就是在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
今天给你们分享一下小例子,就是SeekBar在移动时,当前进度也一块儿移动,具体看图啦。web 其实原理很简单,就是在Seekbar在移动时,改变当前时间的位置。代码以下:idepublic class MainActivity extends RxAppCompatActivity {private TextView seekCurTime, curTime, totalTime;private...
一、自定义控件 用于在
SeekBar
上方,跟随
SeekBar
一块移动的控件
显示
进度
package la.trytry.
seekbar
;import
android
.content.Context;
import
android
.util.Attribu
SeekBar
Step 是可以设置步长、最小
值
、最大
值
的搜索栏
如何使用: m
SeekBar
Step = (
SeekBar
Step) findViewById(R.id.my
SeekBar
Step);
设置最小
值
,最大
值
,步骤尝试 { m
SeekBar
Step.setMaxMin(100, 35, 1); }catch (
SeekBar
StepException e){ }
设置
进度
尝试 { m
SeekBar
Step.setCurrentProgress(10); }catch (
SeekBar
StepException e){ }
m
SeekBar
Step.setOn
SeekBar
StepChangeListener(new
SeekBar
Step.On
SeekBar
StepChangeListener() { @Override public void onPr
还记得几年前写过一个双向
seekbar
吗,不足的是不支持步长扩展,老的双向
seekbar
链接
这几天正好做需求,要扩展一个支持步长,一次只能滑动50个,松开,即刻回弹到距离它最近的单位坐标上,WFK.那么我们要开车了.
需求理一下
回弹确定最终
值
文字描述不能因为太近而遮盖
…..还有一堆扩展属性不说了
老规矩,效果图如下
直接看做出来的成品
接下里就手...
Android
有个群友有个自定义的控件写不出(效果如下),本着救苦救难,就帮他一把,顺便开源出去。
其实这个效果我们去重写
SeekBar
并不好实现,但是通过自定义View还是很好实现的,下面说下思路。我们先画目标(DST)圆角矩形,在其上覆盖源(SRC)圆角矩形,再画两个圆(一个空心,一个实心),步骤就是这么的简单,关键在于位置的计算。
然后是实现后的效果图
首先定义如下 private f