setRotation 改变ImageView的位置

setRotation change the ImageView position

在下面的代码中,我试图用 imageView 替换标签,保持不变 [宽度、高度、TranslateX、TranslateY 和旋转]把它给 imageView :

            transX = selectedSticker.getTransX();
            transY = selectedSticker.getTransY();
            rotation = selectedSticker.getCurrentAngle();
            
            ImageView mHoverView = findViewById(R.id.drawingView);
            mHoverView.setLayoutParams(new FrameLayout.LayoutParams((int) stickerWidth, (int) stickerHeight));
            
            mHoverView.setTranslationX(transX);
            mHoverView.setTranslationY(transY);
            mHoverView.setRotation(rotation);
            mHoverView.setImageResource(R.drawable.dog);
            mHoverView.setBackgroundColor(Color.BLUE);

当我点击 REPLACE 按钮将贴纸替换为 imageView 时,一切正常,问题开始了 当我旋转 贴纸并单击 REPLACE 按钮时,imageView 与贴纸旋转相同,但它设置在错误的位置(imageView 没有围绕它的中心旋转):

例如

无旋转:

旋转:

也许,您必须通过重新计算与View的变换兼容的变换矩阵来获得正确的平移值。

//mHoverView.setTranslationX(transX);
//mHoverView.setTranslationY(transY);

Matrix m = new Matrix();
m.setTranslate(transX, transY);
m.postRotate(rotation);
float[] offset = { 0.0F, 0.0F };
m.mapPoints(offset);

mHoverView.setTranslationX(offset[0]);
mHoverView.setTranslationY(offset[1]);

问题是我没有设置 PivotXPivotY 所以视图不会围绕中心旋转,这里是完整代码:

float[] values = new float[9];
selectedSticker.getMatrix().getValues(values);
float dx = values[2];
float dy = values[5];
mHoverView.setPivotX(0.0f);
mHoverView.setPivotY(0.0f);
mHoverView.setTranslationX(dx);
mHoverView.setTranslationY(dy);
mHoverView.setRotation(rotation);
mHoverView.invalidate();