我在画布上围绕某一点旋转一组位图。我正在使用以下功能来旋转:
private void rotateGroupdAtPoint(ArrayList<MyBitmap> group, int degrees) {
// TODO Auto-generated method stub
float minx=100000,miny=100000,maxx=-100000,maxy=-100000;
for(int i = 0; i < group.size(); i++) {
MyBitmap m = group.get(i);
if(minx > m.getX()) {
minx = m.getX();
}
if(miny > m.getY()) {
miny = m.getY();
}
if(maxx < m.getX() + m.getBmp().getWidth()) {
maxx = m.getX() + m.getBmp().getWidth();
}
if(maxy < m.getY() + m.getBmp().getHeight()) {
maxy = m.getY() + m.getBmp().getHeight();
}
}
float x = (minx+maxx)/2;
float y = (miny+maxy)/2;
Log.d("minmax","min:"+minx+","+maxx+" max:"+miny+","+maxy);
for(int i = 0; i < group.size(); i++) {
Log.d("position before","x:" + group.get(i).getX() + ", y:" + group.get(i).getY());
float newx = (float)(((group.get(i).getX() - x) * Math.cos(Math.toRadians(degrees))) + ((group.get(i).getY() - y) * Math.sin(Math.toRadians(degrees)))) + x;
float newy = (float)(((group.get(i).getX() - x) * Math.sin(Math.toRadians(degrees))) - ((group.get(i).getY() - y) * Math.cos(Math.toRadians(degrees)))) + y;
group.get(i).setX(newx);
group.get(i).setY(newy);
group.get(i).setBmp(rotateBitmap(group.get(i).getBmp(), -90));
Log.d("position","x:" + group.get(i).getX() + ", y:" + group.get(i).getY());
}
}
private Bitmap rotateBitmap(Bitmap bmp, int degrees) {
if (degrees != 0 && bmp != null) {
Matrix matrix = new Matrix();
matrix.setRotate(degrees, (float) bmp.getWidth() / 2, (float) bmp.getHeight() / 2);
try {
Bitmap rotatedBmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
if (bmp != rotatedBmp) {
bmp.recycle();
bmp = rotatedBmp;
}
} catch (OutOfMemoryError ex) {
return null;
}
}
return bmp;
}
首先,我发现所有位图共有的中点然后围绕该点旋转。目前我没有方向问题,我也会添加代码来做到这一点。但我的问题是位图在中心点周围所需的角度下没有正确旋转。任何人都可以指导我错在哪里吗?
答案 0 :(得分:1)
你根本没有旋转位图。您可以使用setX()
和setY()
属性将位图移动到新位置。最重要的是,您需要确定它们应该旋转的程度,并将setRotation()
方法与setPivotX()
和setPivotY()
方法结合使用。
默认情况下,setRotation(float radians)
会围绕您正在旋转的视图的中心点以radians
旋转图像。因此,如果您拨打group.get(i).setRotation(Math.PI/2)
,您的位图将从其所处的位置旋转90度。
您可以通过调用setPivot()
方法调整旋转点。
View view = group.get(i);
view.setPivotX(0);
view.setPivotY(0);
view.setRotation(Math.PI/2);
这会将左上角周围的view
旋转为垂直角度。