Android游戏开发中可能有一些旋转的物体:例如旋转的地球,花朵,齿轮等零部件,或者背景,甚至承载重要逻辑的对象。
如果由像素点构成,逻辑变化,当然是一种思路,但是这样很难有很好的视觉效果,还牵扯到重要的底层算法的实现。
但是如果想让一个图片在Android画面中旋转起来,这里提供一种思路,使用canvas中的参数为矩阵的方法,让画的图片旋转一定角度(当然这里也可以让canvas旋转),即使用canvas的drawBitmap(Bitmap,Matrix,Piant)方法,这里的矩阵可以让图片旋转,放缩,平移。
使用这个方法需要注意:
1, 这样一来本来可以使用参数为两个矩形方法自动让图片适配屏幕,并且让图片自动到自己相应的位置去,但是现在必须手动输入相应的值进行适配,平移。
2, 同时使用矩阵的三个方法进行矩阵的平移逻辑,旋转逻辑,放缩逻辑时会出现一定的逻辑问题(无法正确的同时达到上述三种效果)
3, Matrix使用时注意旋转并不是默认绕图片中心旋转,默认绕0点,即屏幕左上角进行旋转,需要传给其相应的旋转座标点。
下面详细介绍:
1, matrix类的使用
使用setRotate方法进行旋转,可以只传角度参数,此时围绕屏幕左上角点进行旋转,度数采用角度制,非弧度制。还可以传围绕座标的x,y
matrix.setRotate(degree,xx,yy);
使用matrix.postTranslate(x,y)进行平移,注意这里的xy不是绝对座标,而是,水平变化量,竖直变化量,这里建议先进行旋转再进行平移。
使用matrix.postScale进行伸缩,传入参数水平伸缩量,竖直伸缩量。
如上所述,这三个步骤不论先后,如果同时使用,会有逻辑错误。
2,解决办法:
避免三个方法的同时使用。使用别的办法,先对图片伸缩处理好再进行矩阵变换。
我的思路是使用new一个新的Bitmap,设置为想要设置的图片大小,使用canvas在这个图片上画满(即抽象的进行了适配),达到伸缩效果后。
再进行先旋转,再平移。这里是为了方便的得到此时伸缩围绕点的座标。
public void drawImage(Bitmap bitmap, int x, int y, int width, int height,float degree) {
//参数解析:资源图片,平移横纵座标,想要资源的宽高,旋转角度
srcRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight());
dstRect.set(0, 0, width, height);
Matrix matrix=new Matrix();
Bitmap b=Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);//放缩只能提前进行
Canvas canvas1=new Canvas(b);
canvas1.drawBitmap(bitmap,srcRect,dstRect,paint);
//x,y通过矩阵放缩,勿忘矩阵变化
int xx=b.getWidth()/2;
int yy=b.getHeight()/2;
matrix.setRotate(degree,xx,yy);//这里中心点是不会变的
matrix.postTranslate(x,y);//平移
/* matrix.postScale((float)dstRect.width()/(float) srcRect.width(),(float)dstRect.height()/(float) srcRect.height(),x,y);*/
//为何放缩+旋转有问题,这是内部逻辑问题
canvas.drawBitmap(b,matrix,paint);
}
这里是我使用的一个画笔类中的方法,这个方法只要传参,左上角x,y,想要放大的角度,旋转度数,就可以达到旋转的效果。