默认的seekbar,在触摸开始后,不会立即调整数值。只有在触摸停止,或者滑动一段距离后,才会有视觉上的进度变化,这样的进度条,反应太慢,不够灵敏。
怎么实现按下后立即拖动?可以在触摸开始后,手动调用背后的方法。
sysVolSeek.setOnTouchListener((v, event) -> {
if (event.getActionMasked()==MotionEvent.ACTION_DOWN) {
try {
Method mm = AbsSeekBar.class.getDeclaredMethod("trackTouchEvent", MotionEvent.class);
mm.setAccessible(true);
mm.invoke(v, event);
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
});
这是我翻出来的,自己在几年前写的代码,用到了反射,但答案真的是这样吗?于是我把反射的代码移除,发现也可以……
sysVolSeek.setOnTouchListener((v, event) -> event.getActionMasked()== MotionEvent.ACTION_DOWN);
只要在 ACTION_DOWN 的时候返回 true就可以了,这是为什么呢,之前并未给进度条设置触摸监听器,而是在父容器的 intercepttouch 中直接反射调用 trackTouchEvent。
录屏演示
这样的便利性往往被人所忽略,因为追求表面的华丽是容易的,追求真正的以人为本才是难题。