【发布时间】:2017-09-04 13:20:55
【问题描述】:
我正在开发一个 ViewGroup 布局,它能够检测触摸事件并根据触摸事件缩放/旋转/平移它的子视图。我的问题是我希望孩子围绕用户手指之间的点旋转/缩放两个手指,执行手势,不围绕其中心。
我已经安装了手势识别器,并且已经能够围绕孩子的中心进行缩放/平移/旋转。我认为主要问题是将枢轴点(在我的情况下是用户的第一个和第二个指针之间的中点)转换为孩子的当前旋转。我第一次设置枢轴时,效果很好,但是一旦我旋转视图,抬起手指然后尝试围绕另一个枢轴旋转,视图就会跳来跳去。这是它的外观(仅限旋转):
因此,当第一次旋转发生时,它会按预期工作并围绕两个手指之间的点旋转。但是,一旦旋转,下一次旋转会跳转到新位置。以下是相关代码:
@Override
public boolean onRotationBegin(RotationGestureDetector detector) {
float[] coordinates = screenPointsToScaledPoints(new float[]{detector.getFocusX(), detector.getFocusY()});
pivotX = coordinates[0];
pivotY = coordinates[1];
child().setPivotX(pivotX);
child().setPivotY(pivotY);
return true;
}
@Override
public boolean onRotate(RotationGestureDetector detector) {
rotation += detector.getRotationDelta();
return true;
}
private float[] screenPointsToScaledPoints(float[] a){
mRotateMatrixInverse.mapPoints(a);
return a;
}
private void applyScaleAndTranslation() {
View child = child();
child.setRotation(rotation);
mRotateMatrix.setRotate(rotation, pivotX, pivotY);
mRotateMatrix.invert(mRotateMatrixInverse);
}
有什么我可能会遗漏的想法吗?
【问题讨论】:
-
不,不需要任何
invert()ed 矩阵 -
谢谢@pskink!该链接实际上非常有用,并引导我找到解决方案。现在一切正常。作为记录,我需要一个
invert,因为我实际上正在跟踪单点触摸事件并且需要它们的坐标,因为我正在制作一个绘图应用程序,您可以在其中移动画布。如果您将该链接作为答案发布,我可以将其标记为已接受并将我所做的作为单独的答案发布:) -
然后将当前矩阵
transform()ed 的事件提供给您的检测器(或者我错过了您的观点;-(),也可以随意自动回答... -
是的,如果不执行缩放、平移或旋转,我最终会使用当前矩阵转换事件。请参阅答案以获取更多信息:)
标签: android matrix view rotation