我正在尝试使用我在某处找到的现成解决方案来旋转我的Bitmap。代码如下:
public void onDraw(Canvas canvas) {
float x = ship.Position.left;
float y = ship.Position.top;
canvas.drawBitmap(ship.ship, x,y,null);
invalidate();
}
然而,当我这样做时,X和Y轴会改变它们的方向 - 如果我增加Y,则图像朝向屏幕顶部,而不是朝向底部。如果我旋转90度,X也会发生同样的情况。
我需要旋转它但不改变Y和X轴的方向。
即使是旋转,如果我增加Y,我仍然希望Bitmap向下移动,如果我增加X,我仍然希望Bitmap向右移动。
public void update()
{
if(!moving)
{
fall();
}
else //moving
{
move();
faceDirection();
}
Position.top += Speed;
}
private void move() {
if(Speed < MAXSPEED)
Speed -= 0.5f;
}
private void fall() {
if(Speed > MAXSPEED*-1)
Speed += 0.2f;
}
private void faceDirection() {
double OldDiretion = Direction;
Direction = DirectionHelper.FaceObject(Position, ClickedDiretion);
if (Direction != OldDiretion)
{
Matrix matrix = new Matrix();
matrix.postRotate((float)Direction);
ship = Bitmap.createBitmap(ship, 0, 0, ship.getWidth(),ship.getHeight(), matrix, false);
}
我尝试了上面的代码,但是它仍然在改变Y方向,它位于BitMap的底部,而不是屏幕的底部。
以下是项目:https://docs.google.com/file/d/0B8V9oTk0eiOKOUZJMWtsSmUtV3M/edit?usp=sharing
答案 0 :(得分:1)
首先应该旋转,而不是翻译:
matrix.postTranslate(x, y);
matrix.postRotate(degree);
替代方案是尝试使用preRotate()
而不是postRotate()
。
我还强烈建议在绘图时翻译/旋转原稿。因此,createBitmap()
来电不应修改方向。至少在用户交互时动态更改它时不会。否则,您将创建大量位图来反复表示旋转,这会影响性能。
答案 1 :(得分:0)
问题是你实际上没有旋转位图 - 你只是旋转它。因此,下次重绘时,首先通过递增x / y将其向下或向右推,然后旋转它。
您必须实际旋转位图本身。您可以使用以下代码:
ship.ship = Bitmap.createBitmap(ship.ship, 0, 0, ship.ship.getWidth(), ship.ship.getHeight(), matrix, false);
在这里,您可以创建一个新的旋转位图,并将您的引用设置为指向它。
注意!您必须只执行一次!因此,您无法在onDraw
方法中执行此操作,因为每次重绘时它都会旋转。您必须在其他地方执行此操作,然后像往常一样在onDraw
中绘制它(没有矩阵旋转)。