Надеюсь, это легко, потому что я пробовал всевозможные способы избавиться от этого.
Я делаю приложение для Android, которое включает анимацию часов. У меня все работает очень хорошо, кроме одной очень раздражающей вещи.
У меня есть секундная стрелка на часах, и я использую следующий код, чтобы повернуть ее вокруг центральной точки секундной стрелки. Как вы, наверное, заметили, я пытаюсь сделать это похожим на аналоговую секундную стрелку, чтобы она двигалась, а не просто тикала.
public float secdegrees, secondwidth, secondheight;
secondMatrix = new Matrix();
secondwidth = secondHand.getWidth();
secondheight = secondHand.getHeight();
secdegrees = anglepersec * secnow;
secdegrees += anglepluspermilli * millis;
secondMatrix.setRotate(secdegrees, secondwidth/2, secondheight / 2);
newSecond = Bitmap.createBitmap(secondHand, 0, 0,
(int) secondwidth, (int) secondheight, secondMatrix, true);
c.drawBitmap(newSecond, (centrex - newSecond.getWidth()/2),
((face.getHeight()/2) - newSecond.getHeight()/2), null);
На самом деле он выполняет именно ту работу, которую я хочу... почти.
Проблема в том, что руки слегка дрожат/покачиваются вокруг центральной точки, но это действительно заметно и действительно портит эстетику.
Я в значительной степени подозреваю, что это способ округления значения с плавающей запятой, но я надеялся, что кто-то сталкивался с этим раньше и имел какие-либо идеи о том, как от этого избавиться.
Для справки, изображение секундной стрелки изначально имело размер 74 x 28 пикселей и (в настоящее время) 74 x 74 пикселей в формате .png, при этом середина секундной стрелки точно пересекает точку пересечения. Я также пытался сделать его 75 x 75, чтобы на самом деле был центральный пиксель, но не повезло.
Любая помощь вообще будет оценена по достоинству.
** ОБНОВИТЬ
Я пытался изменить код на случай, если десятичные знаки пропадали, но, боюсь, все равно не повезло. Вот вариант 2, который я пробовал и потерпел неудачу;
secondMatrix = new Matrix();
secondwidth = secondHand.getWidth();
secondheight = secondHand.getHeight();
secdegrees = anglepersec * secnow;
secdegrees += anglepluspermilli * millis;
secondMatrix.setRotate(secdegrees, secondwidth/2, secondheight / 2);
newSecond = Bitmap.createBitmap(secondHand, 0, 0, (int) secondwidth,
(int) secondheight, secondMatrix, true);
float secW = newSecond.getWidth()/2;
float secH = newSecond.getHeight()/2;
// NEW CODE HERE
float calcdeg = secdegrees % 90;
calcdeg = (float) Math.toRadians(calcdeg);
float NegY = (float) ((secondwidth*Math.cos(calcdeg)) +
(secondwidth * Math.sin(calcdeg)));
c.drawBitmap(newSecond, centrex - NegY/2,
((face.getHeight()/2) - NegY/2), null);