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