Я хочу остановить анимацию, как только я нажму кнопку. Я имею в виду, что я хочу приостановить анимацию кнопки, когда она нажата, и хочу показать изображение вместо этой кнопки. Я хочу сделать это для уровня api > 11. Я использую аниматор значений для анимации. Пожалуйста, помогите
Нет поддержки API для приостановки/возобновления анимации на уровне API 11. Эти функции были добавлены в уровень API 19.
Однако здесь вы можете попробовать qaru.site/questions/643981/...
То, что я сделал, это создать мое собственное значение interpolatedTime
и игнорировать отправленное.
Если анимация приостановлена, я продолжаю обновлять прошедшее время. Затем я вычисляю собственное значение интерполированного времени и использую его для любой анимации, которую я делаю.
/**
* The animator for the LinearProgressBar.
*/
class LinearProgressBarAnimator extends Animation
{
private LinearProgressBar _bar;
/**
* The desired fill percent when done animating.
*/
private float _newFillPercent;
/**
* The current fill percent.
*/
private float _oldFillPercent;
/**
* Keeps track of if this object is in a paused state.
*/
private boolean _paused;
/**
* TimeConstants trackers to fire _onSecondTick
* at consistent 1 second intervals.
*/
private long _accumulatedTickTime;
private long _lastAccumulatedTime;
/**
* Creates a linear progress bar animator with the reference bar and desired fill percent.
* Call Animate() in order to make it animate the ProgressBar.
* @param bar
* @param newFillPercent
*/
public LinearProgressBarAnimator(LinearProgressBar bar, float newFillPercent)
{
super();
_newFillPercent = newFillPercent;
_oldFillPercent = bar.getFillPercent();
_bar = bar;
_paused = false;
_accumulatedTickTime = 0;
_lastAccumulatedTime = TimeConstants.NOT_SET;
}
/**
* Applies the interpolated change in fill percent.
* @param interpolatedTime
* @param transformation
*/
@Override
protected void applyTransformation(float interpolatedTime, Transformation transformation)
{
if (_lastAccumulatedTime == TimeConstants.NOT_SET || _paused)
{
_lastAccumulatedTime = System.currentTimeMillis();
return;
}
_accumulatedTickTime += System.currentTimeMillis() - _lastAccumulatedTime;
// This handles pausing, the passed interpolatedTime is ignored
float adjustedInterpolatedTimed = (float)_accumulatedTickTime / (float)getDuration();
float newTimeAdjustedFillPercent = _oldFillPercent + ((_newFillPercent - _oldFillPercent) * adjustedInterpolatedTimed);
_bar.setFillPercent(newTimeAdjustedFillPercent);
_bar.requestLayout();
_lastAccumulatedTime = System.currentTimeMillis();
}
public void pause()
{
_paused = true;
}
public void play()
{
_paused = false;
}
}