Надеюсь, это непросто, потому что я старался изо всех сил избавиться от этого.Проблема с Android с поворотом изображения и матрицей
Я делаю приложение для 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 px x 28 px и является (в настоящее время) 74 x 74 пикселя .png с серединой второй руки, точно пересекающей точку пересечения. Я также попытался сделать это 75 х 75, так что на самом деле есть центральный пиксель, но не повезло.
Любая помощь вообще будет оценена по достоинству.
** UPDATE
Я попытался изменить код в случае десятые не становились упал, но все-таки не повезло, я боюсь. Вот вариант 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);
Являются ли secondwidth и secondhight плавает или ints? –
Они плавают. Я обновил код выше. – Dean
Я думаю, что этот вопрос является дубликатом http://stackoverflow.com/q/3603646/94363 – rds