Android ScaleAnimation в движущемся представлении

Я пытаюсь анимировать представление для увеличения при касании и уменьшения при касании. Ниже приведены мои объявления анимации:

scale_up.xml

<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fillAfter="true"
    android:duration="500"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="1.5"
    android:toYScale="1.5" />

scale_down.xml

<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fillAfter="true"
    android:duration="500"
    android:fromXScale="1.5"
    android:fromYScale="1.5"
    android:toXScale="1.0"
    android:toYScale="1.0" />

Затем я использую метод onTouch SurfaceHolder для доступа к MotionEvents:

public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mView.startAnimation(mScaleUp);
            mView.invalidate();
            // Intentional fall-through

        case MotionEvent.ACTION_MOVE:
            float[] focusCoords = translatePointerCoords(this, event);

            mView.setX(focusCoords[0] - mView.getWidth() / 2);
            mView.setY(focusCoords[0] - mView.getHeight() / 2);

            mView.invalidate();
            mView.requestLayout();
            break;

        case MotionEvent.ACTION_UP:
            mView.startAnimation(mScaleDown);
            mView.invalidate()
            break;
    }
}

public static float[] translatePointerCoords(View view, MotionEvent event) {
    final int index = event.getActionIndex();
    final float[] coords = new float[] { event.getX(index), event.getY(index) };
    Matrix matrix = new Matrix();
    view.getMatrix().invert(matrix);
    matrix.postTranslate(view.getScrollX(), view.getScrollY());
    matrix.mapPoints(coords);

    return coords;
}

Вид mView имеет разрешение 120dp x 120dp и изначально отрисовывается в позиции (0, 0). Если анимация отключена, я вижу, как вид перетаскивается под мой искатель. Однако, когда анимация включена, при касании пальцем вниз я вижу, что изображение увеличивается, но также смещается в нижнем правом направлении. Оказывается, если я поднесу палец к координатам родителя (0, 0), вид не сместится. Это означает, что pivotX и pivotY каким-то образом либо игнорируются, либо каким-то образом кэшируются со старой позицией представления, когда я загружаю анимацию. Кроме того, когда я начинаю двигать пальцем, я вижу, что масштабированное изображение искажается и все перепуталось:

Искажение изображения после касания и перемещения.

Основываясь на всем этом, я понял, что анимация движения с подвижными/динамическими представлениями не предназначена для совместного воспроизведения. Должен ли я использовать анимацию свойств? Это то, что обычно используется для выполнения таких задач?

Спасибо за любой совет!


person Vadym    schedule 09.05.2014    source источник


Ответы (1)


У меня такая же проблема. Это потому, что ваш «настоящий» LayoutParam слишком мал, чтобы обновить всю область «fillAfter». Простой способ решить эту проблему: аннулировать родительский макет!

person Yuying Chen    schedule 29.10.2014