【问题标题】:Bitmap Matrix postRotate changes X and Y axis direction位图矩阵 postRotate 改变 X 和 Y 轴方向
【发布时间】:2013-03-22 14:33:40
【问题描述】:

我正在尝试使用我在某处找到的现成解决方案来旋转我的位图。代码如下:

      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,我仍然希望位图向底部移动,如果我增加 X,我仍然希望位图向右移动。

     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

【问题讨论】:

  • 澄清一下,您不希望它围绕中心点旋转,而是围绕左上角旋转?
  • 我希望它在用户触摸的地方旋转,但是重力仍然会将位图推到底部,现在,它是这样的:如果您单击顶部,“重力”会发生变化,并且位图是转到顶部而不是底部,因为它已旋转(180)并且我不想要它。
  • 您能否发布您的代码部分,在其中更改 x/y 并观察异常行为?
  • 更新了问题,就是这样。

标签: android canvas matrix


【解决方案1】:

你应该先旋转,而不是平移:

matrix.postTranslate(x, y);
matrix.postRotate(degree);

替代方法是尝试使用preRotate() 而不是postRotate()

我还强烈建议在绘图时翻译/旋转原件。所以你的createBitmap() 电话不应该修改方向。至少当您在用户交互时动态更改它时不会。否则,您将创建大量位图来一次又一次地表示旋转,这会影响性能。

【讨论】:

    【解决方案2】:

    问题是您实际上并没有旋转位图 - 您只是将其绘制旋转。所以,下次你重绘它时,你首先通过增加 x/y 将它推向底部或右侧,然后旋转它。

    您必须实际旋转位图本身。您可以使用以下代码:

    ship.ship = Bitmap.createBitmap(ship.ship, 0, 0, ship.ship.getWidth(), ship.ship.getHeight(), matrix, false);
    

    在这里您创建一个新的旋转位图并将您的引用设置为指向它。

    注意!您只能这样做一次!所以你不能在onDraw 方法中做到这一点,因为每次重绘它都会旋转。你必须在其他地方做,然后像往常一样在onDraw 中绘制它(没有矩阵旋转)。

    【讨论】:

    • 还是不行,我改了问题的代码,再检查一下PLEASEEE!
    • 问题的最后,就是项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多