在 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 方法
我正在尝试制作一个应用程序,其中底角是一个模拟计时器,秒针(针)像旧秒表一样一圈又一圈。我的刻度盘和指针是在"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 方法