我正在尝试为视图设置动画,以便在触摸时向上扩展并在触摸时向下缩小。以下是我的动画声明:
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要么被忽略,要么以某种方式在加载动画时以旧视图的位置缓存它们。此外,当我开始移动手指时,我看到缩放的图像变形并且全部搞砸了:
基于所有这一切,我认为补间动画与动态/动态视图并不意味着一起玩。我应该使用房产动画吗?这是常用于执行此类任务的内容吗?
感谢您的任何建议!
答案 0 :(得分:0)
我也有同样的问题。这是因为你的“真实”LayoutParam太小而无法更新整个“fillAfter”区域。解决这个问题的简单方法:使父布局无效!