在 Surface View 的一角旋转位图(时钟指针),就像一个旧的秒表计时器?

Rotate a Bitmap(a clocks hand) in a corner of Surface View, like an old stop watch timer?

我正在尝试制作一个应用程序,其中底角是一个模拟计时器,秒针(针)像旧秒表一样一圈又一圈。我的刻度盘和指针是在"onDraw(Canvas canvas)"中绘制的.png文件,被我的GameLoopThread重复调用(这里没有问题)。针由我测试过的单独锚点旋转,这也很好用。

问题:当计算并绘制针的新角度时,它出现在表面视图的 top/left 点上,可能是 (0,0)。而我在画表盘的底角需要它!?

这是我的代码

private void rotateCalc() {
         matrix = new Matrix();
          newAngle++;
           matrix.postRotate(newAngle, 95, 10);//anchor points(95,10) for rotation
    }

      @Override
        public void onDraw(Canvas canvas) {
           canvas.drawBitmap(dialimg, null, dstbmp, null);
           canvas.drawBitmap(needle, null,dstneedle,null);

           rotateCalc();
           canvas.drawBitmap(needle, matrix, null);

      }

我想这可能是因为当使用带有矩阵的 .drawBitmap 方法时,我无法传递我希望绘制旋转位图的 Rect(尺寸)或 x,y(坐标)。

知道如何解决这个问题吗?

哇!效果很好。这是我的代码,只是检查这个序列是否正常?没有特定的逻辑顺序,对吧?

private void rotateCalc() {
         matrix = new Matrix();

           i++;
           matrix.postRotate(i, 145, 8);
           matrix.postScale(0.5f, 0.5f);
           matrix.postTranslate(149, 337);

    }

最后一个问题,我发现位图有点起伏不定,如..我的意思是锯齿状,不是很平滑。对此可以做些什么?

我读过合并 "Bitmap.Config.ARGB_8888",真的需要吗?如果是这样,你能给我举个例子吗?非常感谢@pskink,你帮了大忙

编辑 仅在 matrix.postScale(dx, dy) 之后调用 matrix.postRotate(angle, x, y) 非常重要,因为如果您先旋转,则必须根据原始图像计算锚点您已选择作为您的位图。我更喜欢缩放它,然后找出新的 Width/Height 然后决定我的锚点。

与创建可以缩放位图并在同一函数中应用矩阵相比,这种方式效率低吗?

之后是我们创建的新位图上的常规 onDraw 方法