Удерживать анимацию между недействительными

Я пытаюсь сохранить состояние просмотра после аннулирования, и я очень неудачно.

Дело в том, что у меня есть изображение, которое пользователь может масштабировать (справа или слева). После того, как он масштабирует его, приложение будет рисовать точки в некоторых местах, а после того, как пользователь нажмет на некоторые из них, я хочу, чтобы это изменилось (это карта с выбираемыми городами).

Проблема в том, что после нажатия на точку мне нужно вызвать invalidate(), чтобы снова вызвать onDraw() - чтобы изменить точку, но после аннулирования карта возвращается в исходное состояние, поэтому ее снова "не увеличивают". Не могли бы вы сказать мне, как сохранить состояние анимации, примененной для просмотра с помощью метода invalidate?

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if (zoomed) {
        Paint p //init Paint
        for (Location l : locations) {
            if (l.selected) {
                canvas.drawCircle(l.calculatedPixels.X, l.calculatedPixels.Y, pxFromDp(getContext(), 10), p);
            } else {
                canvas.drawCircle(l.calculatedPixels.X, l.calculatedPixels.Y, pxFromDp(getContext(), 5), p);
                p.setStyle(Paint.Style.STROKE);
                canvas.drawCircle(l.calculatedPixels.X, l.calculatedPixels.Y, pxFromDp(getContext(), 10), p);
            }
//NOTHING OF THIS WORKS CORRECTLY
        if (scaleByTownTouch && getScaleX() != scaleTo) {
            //canvas.restore();
            setScaleX(scaleTo);
            setScaleY(scaleTo);
            setPivotX(pivotX);
            setPivotY(pivotY);

            /*ScaleAnimation scaleAnimation = new ScaleAnimation(scaleFrom, scaleTo, scaleFrom, scaleTo, pivotX, pivotY);
            scaleAnimation.setDuration(0);
            scaleAnimation.setFillAfter(true);
            this.startAnimation(scaleAnimation);*/
            scaleByTownTouch = false;
        }
    }
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if (zoomed) {
            for (Location l : locations) {
                if (l.calculatedPixels.isTouchNearPoint(event.getX(), event.getY(), 50, scaleTo)) {
                    l.selected = !l.selected;
                    scaleByTownTouch = true;
                    //THIS UNZOOMS WHOLE VIEW
                    invalidate();
                    return true;
                }
            }
            zoom(new Point());
        } else {
            float xTouch = event.getX();
            float yTouch = event.getY();
            Point touch = new Point();
            touch.X = xTouch / measuredX * 100;
            touch.Y = 100 - (yTouch / measuredY * 100);
            zoom(touch);
        }
    }
    return false;
}

public void zoom(Point touch) {
    if (!scaleByTownTouch) {
        if (!zoomed) {
            if (!touch.isBelowLine()) {
                pivotX = measuredX;
                pivotY = measuredY;
                scaleTo = 1.7f;
            } else {
                pivotX = 0;
                pivotY = 0;
                scaleTo = 1.5f;
            }
            scaleFrom = 1;
        } else {
            scaleFrom = scaleTo;
            scaleTo = 1;
        }

        final MapImageView miv = this;
        ScaleAnimation scaleAnimation = new ScaleAnimation(scaleFrom, scaleTo, scaleFrom, scaleTo, pivotX, pivotY);
        scaleAnimation.setDuration(1000);
        scaleAnimation.setFillAfter(true);
        scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationEnd(Animation animation) {
                zoomed = !zoomed;
                miv.invalidate();
            }
        });
        this.startAnimation(scaleAnimation);
    }
}

1 ответ

Решение

Вы должны попытаться использовать Animator вместо анимации. Анимация изменяет только рендеринг, тогда как Animator меняет свойство объекта, которое будет сохранено после аннулирования.

Посмотрите на ValueAnimator или ObjectAnimator.

Другие вопросы по тегам