我正在尝试制作一个带有两个可以同时控制的搜索栏的Android应用程序(多点触控)。完整的源代码可以找到here
该应用程序是一个机器人控制器,每个搜索栏控制一个电机,以便向前移动你向上滑动两个杆等(速度由你向上或向下推动的距离控制)50其中停止状态,100是最大前进速度,0是最大速度后退。
我想要实现的是,在你放开搜索栏之后,它将返回到停止状态(进度50),但是,即使该值实际设置为50(使用setProgress
)但是观点不会更新以反映这一点。
我尝试使用.invalidate()
,.requestLayout()
和一些旧解决方案here和here,但无法使用它。
以下是代码的一部分:(完整代码检查上面的github链接)
public class MainActivity extends ActionBarActivity {
...
...
public static void ResetSeekBar(View v) {
if ( v.getId() == R.id.sb1) {
Log.d("before", "Progress = " + Integer.toString(sb1.getProgress()));
sb1.setProgress(50);
Log.d("after", "Progress = " + Integer.toString(sb1.getProgress()));
sb1.invalidate();
//sb1.requestLayout();
} else if ( v.getId() == R.id.sb2) {
sb2.setProgress(50);
}
}
}
public class MySeekBar extends SeekBar {
public MySeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public boolean onTouchEvent(final MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.d("tag", "UP");
MainActivity.ResetSeekBar(this);
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
Log.d("tag", Integer.toString(getProgress()));
MainActivity.UpdateText(this, Integer.toString(getProgress()));
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
Log.d("tag", "DOWN ");
MainActivity.UpdateText(this, Integer.toString(getProgress()));
}
return super.onTouchEvent(event);
}
}
使用onClick上的常规按钮可以更新视图,但不能在MotionEvent之后更新。那么我做错了什么?
另外,如何将其重置为50但快速转换而不是突然跳到中间?
答案 0 :(得分:0)
当然,解决问题的方法是你问人!无论如何,它比我想象的要简单得多。
在处理事件之前应该调用 super.onTouchEvent(event)
,我想我在实际处理更改之前尝试更改它,所以它覆盖了我的所作所为! (不确定只是根据我看到的行为进行猜测)
以下是修复后的函数:
public boolean onTouchEvent(final MotionEvent event) {
super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.d("tag", "UP");
MainActivity.ResetSeekBar(this);
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
Log.d("tag", Integer.toString(getProgress()));
MainActivity.UpdateText(this, Integer.toString(getProgress()));
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
Log.d("tag", "DOWN ");
MainActivity.UpdateText(this, Integer.toString(getProgress()));
}
return true;
}