やりたいこと
SeekBarのプログレスを任意に設定し、OnSeekBarChangeListenerを発生させる。
onProgressChanged(SeekBar seekBar, int progress, boolean fromUser);
onStartTrackingTouch(SeekBar seekBar);
onStopTrackingTouch(SeekBar seekBar);
ハマったこと
SeekBar.setProgress(int progress);
setProgressではOnSeekBarChangeListenerが発生しない。
解決方法
新たにSeekBar操作用のViewActionを定義する。
onView(isAssignableFrom(SeekBar.class)).perform(clickSeekBar(i));
public static ViewAction clickSeekBar(final int pos) {
return new GeneralClickAction(
Tap.SINGLE,
new CoordinatesProvider() {
@Override
public float[] calculateCoordinates(View view) {
SeekBar seekBar = (SeekBar) view;
final int[] screenPos = new int[2];
seekBar.getLocationOnScreen(screenPos);
int trueWidth = seekBar.getWidth()
- seekBar.getPaddingLeft() - seekBar.getPaddingRight();
float relativePos = (0.3f + pos) / (float) seekBar.getMax();
if (relativePos > 1.0f)
relativePos = 1.0f;
final float screenX = trueWidth * relativePos + screenPos[0]
+ seekBar.getPaddingLeft();
final float screenY = seekBar.getHeight() / 2f + screenPos[1];
float[] coordinates = {screenX, screenY};
return coordinates;
}
},
Press.FINGER);
}