【问题标题】:Rotate 'something that can be drawn on Canvas'旋转“可以在画布上绘制的东西”
【发布时间】:2012-04-27 15:55:23
【问题描述】:

您好,关于旋转有问题。我目前正在画布上绘制一些对象。目前这个“对象”只是位图。在计算旋转并将其传递到 Matrix 中后,我不得不创建一个新的位图以使其旋转。一个小的 sn-p 将澄清这一点:

public void onDraw(Canvas canvas){
    mMatrix = new Matrix();
    mMatrix.postRotate(getRotation());
    Bitmap rotateBmp = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), mMatrix, true);
    canvas.drawBitmap(rotateBmp, mCoords.x -(mBitmap.getWidth() / 2), mCoords.y - ( mBitmap.getHeight() / 2), null);
    rotateBmp.recycle();
}

为了节省内存,我所能做的就是在rotateBmp 上调用回收,它会在大部分时间正确运行。假设我有 10 个要旋转的位图“对象”。这意味着我必须保留十个位图作为“样本”,并在每个绘制周期中创建十个新位图以及一个额外的新矩阵(没有找到“重置”它的方法)。这对我来说听起来很奇怪。有没有另一种方法,可以动态创建“可以在画布上绘制的东西”(没有 XML),同时保持对旋转的控制。任何想法都非常受欢迎。如果它是 View、Drawable 或另一个 CustomClass 无关紧要。也许重要的是getRotation 对于应该绘制的每个“东西”都是一样的。这样做的最佳做法是什么?

【问题讨论】:

    标签: android matrix bitmap rotation drawable


    【解决方案1】:

    您可以使用canvas.rotate(float degrees) 旋转Canvas

    public void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, mCoords.x -(mBitmap.getWidth() / 2), mCoords.y - ( mBitmap.getHeight() / 2), null);
        canvas.rotate(getRotation());
    }
    

    【讨论】:

    • 这不会保留我的位图的位置。如果我要更改getRotation 的结果,它们会“跑出屏幕”...假设:我将位图绘制在(0,0) 然后将我的画布旋转 -90 度:我的位图将被推出屏幕
    • 那是因为旋转的锚点是左上角(0,0)。如果您想要将旋转锚定在图像的中心,则必须发布平移画布以模拟中心作为锚点。不幸的是,我的几何学很糟糕,所以我不确定你需要应用的算法,但这就是你需要做的。
    【解决方案2】:

    在@Jason Robinson 和how To Rotate Text in Canvas 的大力帮助下,我找到了一种方法,我可以做到这一点。这是一个简短的 sn-p,它将起作用:

    Bitmap mBitmap = getResources()...
    int xPositionOfBitmap
    int yPositionOfBitmap
    public void onDraw(Canvas canvas) {
        int bitmapCenterX = xPositionOfBitmap + (mBitmap.getWidth() / 2)
        int bitmapCenterY = yPositionOfBitmap + (mBitmap.getHeight() / 2)
        canvas.save()
        canvas.rotate(getRotation(),bitmapCenterX, bitmapCenterY)
        canvas.drawBitmap(mBitmap, xPositionOfBitmap, yPositionOfBitmap)
        canvas.restore()
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2011-08-25
      • 2015-11-03
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多