Android 围绕中心点旋转位图并裁剪边角
Android rotating bitmap around center point with cropping the corners
简介
大家好!
我正在制作一个应用程序,它会根据罗盘的变化旋转包含我大学地图的位图。
我有一张我的大学和附近地区的方形照片,在我的 phone 上它有点扁平:
现在我只需要显示校园区域,我通过在自定义视图的 canvas 上绘制该位图的矩形部分来实现的:
问题
我的问题是我无法围绕中心点旋转位图。
现在旋转 30 度是这样的:
它根本不起作用,校园从较小的矩形中消失了。
我不希望图像围绕它的中心旋转,我希望图像的角偏离 canvas,这样校园就保持在同一个位置并很好地旋转。
当前方法
为了显示地图,我使用覆盖了 onDraw 方法的自定义视图。
@Override
protected void onDraw(Canvas canvas) {
Rect rekt = new Rect();
Rect tyrRekt = new Rect();
super.onDraw(canvas);
tyrRekt.set(0, 0, canvas.getWidth(), canvas.getHeight());
rekt.set(350, 370, 1520, 900);
canvas.drawBitmap(bitmap, rekt, tyrRekt, null);
}
并且位图在 AsyncTask 中旋转以节省一些内存,RotateTaskParams 是一个具有原始位图和度数的对象:
@Override
protected Bitmap doInBackground(RotateTaskParams... params) {
Matrix matrix = new Matrix();
matrix.postRotate(params[0].deg);
rotateBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(params[0].bmp, 0, 0 ,params[0].bmp.getWidth(), params[0].bmp.getHeight(), matrix, true ));
return rotateBitmap.get();
}
我尝试过的事情
我搜索了很多,在这里阅读了大量类似的问题,并尝试了很多答案。
什么不适合我(也许我做错了什么)
- postTranslating 矩阵(以 0,0 为中心)
- 旋转canvas
post围绕位图中心旋转
matrix.postTranslate(参数[0].deg, 参数[0].bmp.getWidth()/2 , 参数[0].bmp.getHeight()/2);
params[0].bmp 始终是原始图像。
提前致谢!
试试
matrix.postRotate(90);
Bitmap rotated = Bitmap.createBitmap(originalBitmap, 0, 0, originalBitmap.getWidth(),
originalBitmap.getHeight(), matrix, true);
并在您的 xml 中,将 android:scaleType="centerCrop" 设置为您的 ImageView 标签。
希望对你有帮助。
从位图绘制切换到 Google 地图有助于我以良好的性能实现预期结果,API 拥有这里需要的一切
简介
大家好!
我正在制作一个应用程序,它会根据罗盘的变化旋转包含我大学地图的位图。
我有一张我的大学和附近地区的方形照片,在我的 phone 上它有点扁平:
现在我只需要显示校园区域,我通过在自定义视图的 canvas 上绘制该位图的矩形部分来实现的:
问题
我的问题是我无法围绕中心点旋转位图。
现在旋转 30 度是这样的:
它根本不起作用,校园从较小的矩形中消失了。
我不希望图像围绕它的中心旋转,我希望图像的角偏离 canvas,这样校园就保持在同一个位置并很好地旋转。
当前方法
为了显示地图,我使用覆盖了 onDraw 方法的自定义视图。
@Override
protected void onDraw(Canvas canvas) {
Rect rekt = new Rect();
Rect tyrRekt = new Rect();
super.onDraw(canvas);
tyrRekt.set(0, 0, canvas.getWidth(), canvas.getHeight());
rekt.set(350, 370, 1520, 900);
canvas.drawBitmap(bitmap, rekt, tyrRekt, null);
}
并且位图在 AsyncTask 中旋转以节省一些内存,RotateTaskParams 是一个具有原始位图和度数的对象:
@Override
protected Bitmap doInBackground(RotateTaskParams... params) {
Matrix matrix = new Matrix();
matrix.postRotate(params[0].deg);
rotateBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(params[0].bmp, 0, 0 ,params[0].bmp.getWidth(), params[0].bmp.getHeight(), matrix, true ));
return rotateBitmap.get();
}
我尝试过的事情
我搜索了很多,在这里阅读了大量类似的问题,并尝试了很多答案。 什么不适合我(也许我做错了什么)
- postTranslating 矩阵(以 0,0 为中心)
- 旋转canvas
post围绕位图中心旋转
matrix.postTranslate(参数[0].deg, 参数[0].bmp.getWidth()/2 , 参数[0].bmp.getHeight()/2);
params[0].bmp 始终是原始图像。
提前致谢!
试试
matrix.postRotate(90);
Bitmap rotated = Bitmap.createBitmap(originalBitmap, 0, 0, originalBitmap.getWidth(),
originalBitmap.getHeight(), matrix, true);
并在您的 xml 中,将 android:scaleType="centerCrop" 设置为您的 ImageView 标签。 希望对你有帮助。
从位图绘制切换到 Google 地图有助于我以良好的性能实现预期结果,API 拥有这里需要的一切