Android ScaleAnimation在移动视图上

时间:2014-05-09 04:21:17

标签: android android-animation android-view 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" />

然后我使用SurfaceHolder的onTouch方法来访问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,最初在lication(0,0)处绘制。如果动画被禁用,我可以看到视图被拖动到我的查找器下。然而,当启用动画时,在我的手指向下触摸时,我看到视图向上扩展但它也在右下方向上移位。事实证明,如果我将手指靠近父母的坐标(0,0),视图就不会移位。这意味着以某种方式,pivotX和pivotY要么被忽略,要么以某种方式在加载动画时以旧视图的位置缓存它们。此外,当我开始移动手指时,我看到缩放的图像变形并且全部搞砸了:

Distorted view after touch and move.

基于所有这一切,我认为补间动画与动态/动态视图并不意味着一起玩。我应该使用房产动画吗?这是常用于执行此类任务的内容吗?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

我也有同样的问题。这是因为你的“真实”LayoutParam太小而无法更新整个“fillAfter”区域。解决这个问题的简单方法:使父布局无效!