Android游戏开发之绘画旋转的物体(Matrix类的逻辑异常)

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,想要放大的角度,旋转度数,就可以达到旋转的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章