2

我正在尝试为视图设置动画,以便在触摸时按比例放大并在触摸时按比例缩小。以下是我的动画声明:

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;
}

视图为 120dp x 120dp ,mView最初在 lication (0, 0) 处绘制。如果动画被禁用,我可以看到视图被拖到我的取景器下。但是,启用动画后,当我的手指向下触摸时,我看到视图放大了,但它也在右下方向移位。事实证明,如果我将手指靠近父母的 (0, 0) 坐标,则视图不会移位。这意味着当我加载动画时,pivotX 和 pivotY 要么被忽略,要么以某种方式被缓存到旧视图的位置。此外,当我开始移动手指时,我看到缩放后的图像变得扭曲并且一团糟:

触摸和移动后视图扭曲。

基于所有这些,我认为具有可移动/动态视图的补间动画并不意味着一起播放。我应该使用属性动画吗?那是执行此类任务的常用方法吗?

感谢您的任何建议!

4

1 回答 1

0

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

于 2014-10-29T14:48:47.037 回答