我正在尝试为视图设置动画,以便在触摸时按比例放大并在触摸时按比例缩小。以下是我的动画声明:
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 要么被忽略,要么以某种方式被缓存到旧视图的位置。此外,当我开始移动手指时,我看到缩放后的图像变得扭曲并且一团糟:
基于所有这些,我认为具有可移动/动态视图的补间动画并不意味着一起播放。我应该使用属性动画吗?那是执行此类任务的常用方法吗?
感谢您的任何建议!