枕上从妨一夜睡,灯前读尽十年诗。这篇文章主要讲述如何让Android搜索栏顺利移动?相关的知识,希望能为你提供帮助。
我试图让SeekBar的移动更顺畅,而不仅仅是直接跳到这个位置。我正在这样做,因为我有一个SeekBar有3个滑块类型实现选项。
我正在寻找创建一个漂亮的平滑滑块,其中3个选项为“是”,“无选项”,“否”为我的应用程序中的功能,而SeekBar看起来是最好和最简单的方式。
我试过看android动画,看起来有点复杂,所以如果有人可以提供任何帮助那就太好了:)
答案我找到了以下解决方案,使搜索栏平滑移动,但仍然捕捉到有限的值范围。假设您的布局中包含以下视图:
<
SeekBar
android:id="@+id/sldProgress"
style="@style/MySliderStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="50" />
<
TextView
android:id="@+id/lblProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5" />
您可以在活动中使用以下代码(在上面的xml中更改android:max的值,并根据您的需要更改下面代码中的平滑因子 - 更高的值=更平滑):
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sliderListener sldListener = new sliderListener();
SeekBar sldProgress = (SeekBar) findViewById(R.id.sldProgress);
sldProgress.setOnSeekBarChangeListener(sldListener);
}
private class sliderListener implements OnSeekBarChangeListener {
private int smoothnessFactor = 10;
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
progress = Math.round(progress / smoothnessFactor);
TextView lblProgress = (TextView) findViewById(R.id.lblProgress);
lblProgress.setText(String.valueOf(progress));
}public void onStartTrackingTouch(SeekBar seekBar) {
}public void onStopTrackingTouch(SeekBar seekBar) {
seekBar.setProgress(Math.round((seekBar.getProgress() + (smoothnessFactor / 2)) / smoothnessFactor) * smoothnessFactor);
}
}
}
另一答案建立我自己的控制。完成工作:)代码here
另一答案【如何让Android搜索栏顺利移动()】你不需要自己构建任何东西只是用户安卓动画它会为你做的事情
用kotlin写的代码
mySeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
//Todo: code
}override fun onStartTrackingTouch(seekBar: SeekBar?) {
}override fun onStopTrackingTouch(seekBar: SeekBar) {
if (seekBar.progress >
70) {
ObjectAnimator.ofInt(seekBar, "progress", 100).setDuration(100).start()
} else if (seekBar.progress <
30) {
ObjectAnimator.ofInt(seekBar, "progress", 0).setDuration(100).start()
} else {
ObjectAnimator.ofInt(seekBar, "progress", 50).setDuration(100).start()
}
}
})
另一答案这对我来说很好,非常简单直接。
if (currentPosition >
0) {
ObjectAnimator animation = ObjectAnimator.ofInt(seekBar, "progress", currentPosition);
animation.setDuration(400);
animation.setInterpolator(new DecelerateInterpolator());
animation.start();
}
另一答案创建自定义SeekBar
public class SmoothSeekBar extends AppCompatSeekBar implements SeekBar.OnSeekBarChangeListener {private SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener;
private boolean mNeedCallListener = true;
private ValueAnimator mAnimator;
public SmoothSeekBar(Context context) {
super(context);
init(context);
}public SmoothSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}public SmoothSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}public void init(Context context) {
Context mContext = context;
}@Override
public void setOnSeekBarChangeListener(
SeekBar.OnSeekBarChangeListener onSeekBarChangeListener) {
mOnSeekBarChangeListener = onSeekBarChangeListener;
super.setOnSeekBarChangeListener(this);
}@Override
public void setProgress(final int progress) {
final int currentProgress = getProgress();
if (mAnimator != null) {
mAnimator.cancel();
mAnimator.removeAllUpdateListeners();
mAnimator.removeAllListeners();
mAnimator = null;
mNeedCallListener = true;
}
mAnimator = ValueAnimator.ofInt(currentProgress, progress);
mAnimator.setDuration(getResources().getInteger(android.R.integer.config_longAnimTime));
mAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = https://www.songbingjia.com/android/(int) animation.getAnimatedValue();
if (value == progress) {
mNeedCallListener = true;
} else {
mNeedCallListener = false;
}
Logger.e("ProgressBar value ", value + "");
SmoothSeekBar.super.setProgress(value);
}
});
mAnimator.start();
}@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser || mNeedCallListener) {
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser);
}
}
}@Override
public void onStartTrackingTouch(SeekBar seekBar) {
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onStartTrackingTouch(seekBar);
}
}@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onStopTrackingTouch(seekBar);
}
}
}
现在在xml中添加SeekBar并享受
<
com.yourPackage.SmoothSeekBar
android:id="@+id/seekBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
推荐阅读
- 从AppWidgetProvider到Broadcastreceiver的意图
- Android中的包含布局已拉长
- 最好的开源渗透和安全测试(黑客)Linux操作系统
- 5个最佳高级足球俱乐部网站模板
- 5个最佳高级酒吧(啤酒)网站HTML模板
- 十大最佳的Android本机Snack通知替换库
- 十大Java程序员应该在2019年学习的工具
- 5个最佳Electron框架的Markdown笔记应用程序
- 5个最佳Javascript承诺Polyfills