Я пытаюсь реализовать анимацию кругового раскрытия, которая состоит в том, чтобы показать вид в соответствии с пальцем пользователя, когда он касается вида.
Во-первых, мой взгляд внутри бесконечной круговой развертки показывает oop, чтобы сохранить округленный аспект, пока пользователь ничего не делает. Затем, когда пользователь коснулся вида и начал сильно ударить, я вычислил коэффициент внутри ACTION_MOVE
, чтобы увеличить радиус в реальном времени и вызвать круговое раскрытие при каждом проходе.
public void reveal(final View view,
final float centerX,
final float centerY,
final float startRadius,
final float endRadius,
final int duration) {
anim = ViewAnimationUtils.createCircularReveal(view, (int)centerX, (int)centerY, (int)startRadius, (int)endRadius);
anim.setDuration(duration);
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
if (isRepeating) {
reveal(view,centerX,centerY,startRadius,endRadius,duration);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
anim.start();
}
Я снова вспомнил метод кругового раскрытия внутри слушателя, чтобы создать l oop и самое важное - избежать визуальных искажений.
Я заметил, что, если бы я не сделал этого, появилось какое-то очень быстрое искажение, потому что продолжительность анимации быстрее, чем каждый проход в ACTION_MOVE
, поэтому аним успевает закончить sh до следующего проходить. Искажение - это представление отсутствующей части вида, когда анимация завершена и очень быстро вернулась к текущему радиусу, установленному с помощью Touch как fla sh.
Таким образом, при вызове метода внутри Слушателя все работает прекрасно, пока не будет.
Проблема: На одном из моих устройств при перелистывании возникают бессмысленные искажения во всех направлениях.
Согласно моим журналам, это не искажение радиуса, потому что радиус начала и конца всегда одинаков после каждого прохода, поэтому радиус не должен двигаться так, особенно когда палец остановлен, и анимация никогда не останавливается, спасибо Слушателю, как я объяснил выше.
Что я делаю не так?
Я много искал и не нашел ту же проблему, поэтому я попробовал другие способы, такие как рисование холста, но, к сожалению, это не соответствует моим потребностям.
Есть ли другой способ добиться этого вид анимации, даже совсем по-другому?
Любое руководство приветствуется заранее
РЕДАКТИРОВАТЬ: внутри ACTION_MOVE
scaleRadius = (float) (2 * distance / maxWidth + startScale);
if (scaleRadius < 1) {
scaleRadius = 1;
}
animator.reveal(this, middleCircleX, middleCircleY,
initialCircleRadius*scaleRadius, initialCircleRadius*scaleRadius, 0);
Журналы: Всегда тот же коэффициент, что радиус не должен двигаться, потому что мой палец остановлен
2020-03-27 15:42:56.113 onTouch: scaleRadius 1.7870371
2020-03-27 15:42:56.113 onTouch: scaleRadius 1.7870373
2020-03-27 15:42:56.227 onTouch: scaleRadius 1.7870371
2020-03-27 15:42:56.227 onTouch: scaleRadius 1.7870373
2020-03-27 15:42:56.331 onTouch: scaleRadius 1.7870374
2020-03-27 15:42:56.331 onTouch: scaleRadius 1.7870371