在Android中使用旋转角度缩放自定义视图中的图像

在Android中使用旋转角度缩放自定义视图中的图像,android,matrix,rotation,scale,android-custom-view,Android,Matrix,Rotation,Scale,Android Custom View,嗯,这可能有点难以解释,但这里是交易:我有一个自定义视图,它有一个背景图像和一些其他较小的图像绘制在上面。当用户选择保存它的选项时,整个视图将缩放到某个分辨率,比如900x900px。因此,如果手机为720p,图像将放大,而如果屏幕为1080p,图像将缩小 如何进行缩放: 我获取视图的布局参数,并将宽度更改为900px 背景存储的图像正好是900px,因此当视图准备保存时,我只需完全重新加载背景图像 质量 所有其他的小图像也会被缩放,包括它们的大小和它们在屏幕上的位置 因此,如果最初屏幕大小

嗯,这可能有点难以解释,但这里是交易:我有一个自定义视图,它有一个背景图像和一些其他较小的图像绘制在上面。当用户选择保存它的选项时,整个视图将缩放到某个分辨率,比如900x900px。因此,如果手机为720p,图像将放大,而如果屏幕为1080p,图像将缩小

如何进行缩放:

  • 我获取视图的布局参数,并将宽度更改为900px
  • 背景存储的图像正好是900px,因此当视图准备保存时,我只需完全重新加载背景图像 质量
  • 所有其他的小图像也会被缩放,包括它们的大小和它们在屏幕上的位置
因此,如果最初屏幕大小为720px宽度,当大小更改为900px时,我计算一个比例因子,在测量范围内
onMeasure

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, widthMeasureSpec);

        if (MeasureSpec.getSize(widthMeasureSpec) == 900) {
                scale = (900 - viewWidth) * 100.2f / viewWidth;
                prepareSaving();
        }
}
然后我在绘制时使用此比例编号:

canvas.drawBitmap(myCachedImage, x + addScale(x), y + addScale(y), imagePaint);
在哪里

这使我能够在缩放坐标下绘制位图,效果与预期一致。 当用户旋转图像时会出现问题。在这方面,我会:

public void rotateSticker(float degrees) {
     imageMatrix.setRotate(degrees, imageCenterX + addScale(imageCenterX), imageCenterY +imageCenterY ));
}
在onDraw内,我有:

if (angle!=0{
   canvas.save(Canvas.MATRIX_SAVE_FLAG);
   canvas.setMatrix(imageMatrix);
   canvas.drawBitmap(myCachedImage, x + addScale(x), y + addScale(y), imagePaint);
   canvas.retore()
}else
{
   canvas.drawBitmap(myCachedImage, x + addScale(x), y + addScale(y), imagePaint);
}
这里是我的问题:如果用户不旋转,所有缩放都正确完成,保存的图像看起来很好。如果存在角度,在缩放时,图像不会绘制在正确的坐标中,而是移动,就像下面的图像一样
所有的缩放和旋转问题都是由图像的矩阵引起的。当我切换到仅使用视图的canvas.rotate()时,一切都正常工作。

myCachedImage的值是多少?它是一个加载的位图,具有128x200px。更改非常简单,我删除了imageMatrix,在onDraw中,我仅使用canvas.rotate()和旋转所需的角度。
if (angle!=0{
   canvas.save(Canvas.MATRIX_SAVE_FLAG);
   canvas.setMatrix(imageMatrix);
   canvas.drawBitmap(myCachedImage, x + addScale(x), y + addScale(y), imagePaint);
   canvas.retore()
}else
{
   canvas.drawBitmap(myCachedImage, x + addScale(x), y + addScale(y), imagePaint);
}